{"version":3,"file":"js/314-c30fc2bf7e72ac1c0c4b.js","mappings":";yFAqBA,SAASA,IACPC,KAAKC,QAAUD,KAAKC,SAAW,CAAC,EAChCD,KAAKE,cAAgBF,KAAKE,oBAAiBC,CAC7C,CAuQA,SAASC,EAAWC,GAClB,MAAsB,oBAARA,CAChB,CAMA,SAASC,EAASD,GAChB,MAAsB,kBAARA,GAA4B,OAARA,CACpC,CAEA,SAASE,EAAYF,GACnB,YAAe,IAARA,CACT,CApRAG,EAAOC,QAAUV,EAKjBA,EAAaW,UAAUT,aAAUE,EACjCJ,EAAaW,UAAUR,mBAAgBC,EAIvCJ,EAAaY,oBAAsB,GAInCZ,EAAaW,UAAUE,gBAAkB,SAASC,GAChD,GA4PsB,kBA5PRA,GAAMA,EAAI,GAAKC,MAAMD,GACjC,MAAME,UAAU,+BAElB,OADAf,KAAKE,cAAgBW,EACdb,IACT,EAEAD,EAAaW,UAAUM,KAAO,SAASC,GACrC,IAAIC,EAAIC,EAASC,EAAKC,EAAMC,EAAGC,EAM/B,GAJKvB,KAAKC,UACRD,KAAKC,QAAU,CAAC,GAGL,UAATgB,KACGjB,KAAKC,QAAQuB,OACblB,EAASN,KAAKC,QAAQuB,SAAWxB,KAAKC,QAAQuB,MAAMC,QAAS,CAEhE,IADAP,EAAKQ,UAAU,cACGC,MAChB,MAAMT,EAGN,IAAIU,EAAM,IAAID,MAAM,yCAA2CT,EAAK,KAEpE,MADAU,EAAIC,QAAUX,EACRU,CAEV,CAKF,GAAIrB,EAFJY,EAAUnB,KAAKC,QAAQgB,IAGrB,OAAO,EAET,GAAIb,EAAWe,GACb,OAAQO,UAAUD,QAEhB,KAAK,EACHN,EAAQW,KAAK9B,MACb,MACF,KAAK,EACHmB,EAAQW,KAAK9B,KAAM0B,UAAU,IAC7B,MACF,KAAK,EACHP,EAAQW,KAAK9B,KAAM0B,UAAU,GAAIA,UAAU,IAC3C,MAEF,QACEL,EAAOU,MAAMrB,UAAUsB,MAAMF,KAAKJ,UAAW,GAC7CP,EAAQc,MAAMjC,KAAMqB,QAEnB,GAAIf,EAASa,GAIlB,IAHAE,EAAOU,MAAMrB,UAAUsB,MAAMF,KAAKJ,UAAW,GAE7CN,GADAG,EAAYJ,EAAQa,SACJP,OACXH,EAAI,EAAGA,EAAIF,EAAKE,IACnBC,EAAUD,GAAGW,MAAMjC,KAAMqB,GAG7B,OAAO,CACT,EAEAtB,EAAaW,UAAUwB,YAAc,SAASjB,EAAMkB,GAClD,IAAIC,EAEJ,IAAKhC,EAAW+B,GACd,MAAMpB,UAAU,+BA2ClB,OAzCKf,KAAKC,UACRD,KAAKC,QAAU,CAAC,GAIdD,KAAKC,QAAQoC,aACfrC,KAAKgB,KAAK,cAAeC,EACfb,EAAW+B,EAASA,UACpBA,EAASA,SAAWA,GAE3BnC,KAAKC,QAAQgB,GAGTX,EAASN,KAAKC,QAAQgB,IAE7BjB,KAAKC,QAAQgB,GAAMqB,KAAKH,GAGxBnC,KAAKC,QAAQgB,GAAQ,CAACjB,KAAKC,QAAQgB,GAAOkB,GAN1CnC,KAAKC,QAAQgB,GAAQkB,EASnB7B,EAASN,KAAKC,QAAQgB,MAAWjB,KAAKC,QAAQgB,GAAMsB,SAIpDH,EAHG7B,EAAYP,KAAKE,eAGhBH,EAAaY,oBAFbX,KAAKE,gBAKFkC,EAAI,GAAKpC,KAAKC,QAAQgB,GAAMQ,OAASW,IAC5CpC,KAAKC,QAAQgB,GAAMsB,QAAS,EAC5BC,QAAQhB,MAAM,mIAGAxB,KAAKC,QAAQgB,GAAMQ,QACJ,oBAAlBe,QAAQC,OAEjBD,QAAQC,SAKPzC,IACT,EAEAD,EAAaW,UAAUgC,GAAK3C,EAAaW,UAAUwB,YAEnDnC,EAAaW,UAAUiC,KAAO,SAAS1B,EAAMkB,GAC3C,IAAK/B,EAAW+B,GACd,MAAMpB,UAAU,+BAElB,IAAI6B,GAAQ,EAEZ,SAASC,IACP7C,KAAK8C,eAAe7B,EAAM4B,GAErBD,IACHA,GAAQ,EACRT,EAASF,MAAMjC,KAAM0B,WAEzB,CAKA,OAHAmB,EAAEV,SAAWA,EACbnC,KAAK0C,GAAGzB,EAAM4B,GAEP7C,IACT,EAGAD,EAAaW,UAAUoC,eAAiB,SAAS7B,EAAMkB,GACrD,IAAIY,EAAMC,EAAUvB,EAAQH,EAE5B,IAAKlB,EAAW+B,GACd,MAAMpB,UAAU,+BAElB,IAAKf,KAAKC,UAAYD,KAAKC,QAAQgB,GACjC,OAAOjB,KAMT,GAHAyB,GADAsB,EAAO/C,KAAKC,QAAQgB,IACNQ,OACduB,GAAY,EAERD,IAASZ,GACR/B,EAAW2C,EAAKZ,WAAaY,EAAKZ,WAAaA,SAC3CnC,KAAKC,QAAQgB,GAChBjB,KAAKC,QAAQ6C,gBACf9C,KAAKgB,KAAK,iBAAkBC,EAAMkB,QAE/B,GAAI7B,EAASyC,GAAO,CACzB,IAAKzB,EAAIG,EAAQH,KAAM,GACrB,GAAIyB,EAAKzB,KAAOa,GACXY,EAAKzB,GAAGa,UAAYY,EAAKzB,GAAGa,WAAaA,EAAW,CACvDa,EAAW1B,EACX,KACF,CAGF,GAAI0B,EAAW,EACb,OAAOhD,KAEW,IAAhB+C,EAAKtB,QACPsB,EAAKtB,OAAS,SACPzB,KAAKC,QAAQgB,IAEpB8B,EAAKE,OAAOD,EAAU,GAGpBhD,KAAKC,QAAQ6C,gBACf9C,KAAKgB,KAAK,iBAAkBC,EAAMkB,EACtC,CAEA,OAAOnC,IACT,EAEAD,EAAaW,UAAUwC,mBAAqB,SAASjC,GACnD,IAAIkC,EAAK5B,EAET,IAAKvB,KAAKC,QACR,OAAOD,KAGT,IAAKA,KAAKC,QAAQ6C,eAKhB,OAJyB,IAArBpB,UAAUD,OACZzB,KAAKC,QAAU,CAAC,EACTD,KAAKC,QAAQgB,WACbjB,KAAKC,QAAQgB,GACfjB,KAIT,GAAyB,IAArB0B,UAAUD,OAAc,CAC1B,IAAK0B,KAAOnD,KAAKC,QACH,mBAARkD,GACJnD,KAAKkD,mBAAmBC,GAI1B,OAFAnD,KAAKkD,mBAAmB,kBACxBlD,KAAKC,QAAU,CAAC,EACTD,IACT,CAIA,GAAII,EAFJmB,EAAYvB,KAAKC,QAAQgB,IAGvBjB,KAAK8C,eAAe7B,EAAMM,QACrB,GAAIA,EAET,KAAOA,EAAUE,QACfzB,KAAK8C,eAAe7B,EAAMM,EAAUA,EAAUE,OAAS,IAI3D,cAFOzB,KAAKC,QAAQgB,GAEbjB,IACT,EAEAD,EAAaW,UAAUa,UAAY,SAASN,GAQ1C,OANKjB,KAAKC,SAAYD,KAAKC,QAAQgB,GAE1Bb,EAAWJ,KAAKC,QAAQgB,IACzB,CAACjB,KAAKC,QAAQgB,IAEdjB,KAAKC,QAAQgB,GAAMe,QAJnB,EAMV,EAEAjC,EAAaW,UAAU0C,cAAgB,SAASnC,GAC9C,GAAIjB,KAAKC,QAAS,CAChB,IAAIoD,EAAarD,KAAKC,QAAQgB,GAE9B,GAAIb,EAAWiD,GACb,OAAO,EACJ,GAAIA,EACP,OAAOA,EAAW5B,MACtB,CACA,OAAO,CACT,EAEA1B,EAAaqD,cAAgB,SAASE,EAASrC,GAC7C,OAAOqC,EAAQF,cAAcnC,EAC/B,sCC3RA,IAAIsC,EAAsB,EAAQ,OAC9BC,EAAmB,EAAQ,OAC3BC,EAAgB,EAAQ,OAiC5B,SAASC,EAAoBC,EAAQC,EAAOC,GAC1C,OAAO,IAAIN,EAAoBI,EAAQC,EAAOC,EAChD,CAOAH,EAAoBI,QAAU,EAAQ,OAOtCJ,EAAoBH,oBAAsBA,EAO1CG,EAAoBF,iBAAmBA,EAOvCE,EAAoBD,cAAgBA,EAEpCjD,EAAOC,QAAUiD,sCCnEjB,IAAI3D,EAAe,EAAQ,OAgB3B,SAASgE,EAAcC,EAAYC,GACjCjE,KAAKkE,KAAOF,EACZhE,KAAKiE,GAAKA,EACVjE,KAAKmE,YAAc,IACrB,CAlBe,EAAQ,MAoBvBC,CAASL,EAAehE,GAOxBgE,EAAcrD,UAAU2D,OAAS,WAC/BrE,KAAKkD,qBACLlD,KAAKkE,KAAKI,oBAAoBtE,KAChC,EAEA+D,EAAcrD,UAAU6D,iBAAmB,SAAUC,GACnD,OAAOxE,KAAKiE,GAAGO,EACjB,EAEAhE,EAAOC,QAAUsD,sCC1BjB,IAAIU,EAAe,EAAQ,OACvBC,EAAgB,EAAQ,OACxBC,EAAO,EAAQ,OAEfC,EAAM,CAQRC,cAAe,SAAuBC,EAAgBC,EAAWC,GAC/D,GAAIJ,EAAIK,UAAUH,EAAgBC,EAAWC,GAC3C,OAAOF,EAGT,IAAII,EAAgB,GAAKF,EAErBG,EAAmBL,EAAeC,GAElCD,EAAeC,GAAWK,OAAOF,GADjC,CAACA,GAGDG,EAAM,CAAC,EAIX,OAFAA,EAAIN,GAAaI,EAEVV,EAAa,CAAC,EAAGY,EAAKP,EAC/B,EAUAQ,iBAAkB,SAChBR,EACAC,EACAC,GAEA,QAAc7E,IAAV6E,EAGF,OAAOJ,EAAIW,gBAAgBT,GAAgB,SAAUU,EAAGC,GACtD,OAAOV,IAAcU,CACvB,IAGF,IAAIP,EAAgB,GAAKF,EAEzB,OAAOJ,EAAIW,gBAAgBT,GAAgB,SAAUU,EAAGC,GACtD,OAAOV,IAAcU,GAAKP,IAAkBM,CAC9C,GACF,EAQAE,iBAAkB,SAChBZ,EACAC,EACAC,GAEA,QAAc7E,IAAV6E,EACF,MAAM,IAAIrD,MAAM,gDAElB,OAAIiD,EAAIK,UAAUH,EAAgBC,EAAWC,GACpCJ,EAAIU,iBAAiBR,EAAgBC,EAAWC,GAGlDJ,EAAIC,cAAcC,EAAgBC,EAAWC,EACtD,EAYAO,gBAAiB,SACfT,EACAC,EACAY,GAEA,QAAkBxF,IAAd4E,EAGF,OAAKL,EAAcI,GAGZ,CAAC,EAFCA,EAGJ,GAAyB,kBAAdC,EAChB,OAAOJ,EAAKG,EAAgB,CAACC,IACxB,GAAyB,oBAAdA,EAA0B,CAC1C,IAAIa,GAAa,EAEbC,EAAoBC,OAAOC,KAAKjB,GAAgBkB,QAAO,SACzDC,EACA9C,GAEA,IAAI+C,EAASpB,EAAe3B,IAAQ,GAChCgD,EAAYD,EAAOE,QAAO,SAAUpB,GACtC,OAAQD,EAAUC,EAAO7B,EAAKwC,EAChC,IAQA,OANIQ,EAAU1E,SAAWyE,EAAOzE,SAC9BmE,GAAa,GAGfK,EAAK9C,GAAOgD,EAELF,CACT,GACA,CAAC,GAED,OAAIL,EAAmBC,EAChBf,CACT,CAKF,EAUAG,UAAW,SAAmBH,EAAgBC,EAAWsB,GACvD,IAAIC,EACFC,QAAQzB,EAAeC,KACvBD,EAAeC,GAAWtD,OAAS,EAErC,QAAwBtB,IAApBkG,IAAkCC,EACpC,OAAOA,EAGT,IAAIE,EAA0B,GAAKH,EAEnC,OAAuE,IAAhEvB,EAAeC,GAAW0B,QAAQD,EAC3C,GAGFhG,EAAOC,QAAUmE,sCCzKjB,IAAIH,EAAe,EAAQ,OACvBiC,EAAO,EAAQ,MACfC,EAAe,EAAQ,KACvBC,EAAQ,EAAQ,OAChBlC,EAAgB,EAAQ,OACxBC,EAAO,EAAQ,OACfkC,EAAc,EAAQ,OACtBC,EAAmB,EAAQ,OAE3BC,EAAiB,EAAQ,OAY7B,SAASC,EAAyBC,EAAGC,GACnC,OAAInF,MAAMoF,QAAQF,IAAMlF,MAAMoF,QAAQD,GAElCD,EAAExF,SAAWyF,EAAEzF,QACfwF,EAAEG,OAAM,SAAUC,EAAI/F,GACpB,OAAO0F,EAAyBE,EAAE5F,GAAI+F,EACxC,IAGGJ,IAAMC,CACf,CA+DA,SAAS1D,EAAiB8D,GACxB,IAAIC,EAASD,EACT9D,EAAiBgE,cAAcF,GAC/B,CAAC,OAEoBnH,IAArBoH,EAAOE,WAA4BX,EAAiBS,EAAOE,YAE7DjF,QAAQkF,KACN,mIASJ1H,KAAK2H,OAASJ,EAAOI,QAAU,GAO/B3H,KAAK4H,kBAAoBL,EAAOK,mBAAqB,GASrD5H,KAAK6H,mBAAqBN,EAAOM,oBAAsB,GAevD7H,KAAK8H,kBAAoBP,EAAOO,mBAAqB,CAAC,EAatD9H,KAAK+H,eAAiBR,EAAOQ,gBAAkB,CAAC,EAahD/H,KAAKgI,6BAA+BT,EAAOS,8BAAgC,CAAC,EAY5EhI,KAAKiI,mBAAqBV,EAAOU,oBAAsB,CAAC,EAQxDjI,KAAKkI,eAAiBX,EAAOW,gBAAkB,GAe/ClI,KAAKmI,8BACHZ,EAAOY,+BAAiC,CAAC,EAG3C,IAAIC,EAAOpI,KACX8F,OAAOC,KAAKwB,GAAQc,SAAQ,SAAUC,GACpC,IAAIC,GAAiE,IAApD/E,EAAiBgF,WAAW/B,QAAQ6B,GACjDG,OAAuCtI,IAAtBoH,EAAOe,IAEvBC,GAAcE,IACjBL,EAAKE,GAAaf,EAAOe,GAE7B,GACF,CAOA9E,EAAiBgF,WAAa1C,OAAOC,KAAK,IAAIvC,GAO9CA,EAAiBgE,cAAgB,SAAUkB,GAEzC,GAAIA,aAAwBlF,EAAkB,OAAOkF,EAErD,IAAIC,EAAU,CAAC,EAwCf,GAtCiB,CACf,kBACA,eACA,iBACA,uBACA,sBACA,OACA,oBACA,WACA,sBACA,cACA,gBAGSN,SAAQ,SAAUO,GAC3B,IAAI5D,EAAQ0D,EAAaE,GACzB,GAAqB,kBAAV5D,EAAoB,CAC7B,IAAI6D,EAAcC,WAAW9D,GAE7B2D,EAAQC,GAAK9H,MAAM+H,GAAe7D,EAAQ6D,CAC5C,CACF,IAII9G,MAAMoF,QAAQuB,EAAaK,qBAC7BJ,EAAQI,kBAAoBL,EAAaK,kBAAkBC,KAAI,SAC7DC,GAEA,OAAIlH,MAAMoF,QAAQ8B,GACTA,EAAQD,KAAI,SAAUhE,GAC3B,OAAO8D,WAAW9D,EACpB,IAEKiE,CACT,KAGEP,EAAaT,mBAAoB,CACnC,IAAIA,EAAqB,CAAC,EAC1BnC,OAAOC,KAAK2C,EAAaT,oBAAoBI,SAAQ,SAAUtD,GAC7D,IAAImE,EAAYR,EAAaT,mBAAmBlD,IAAc,CAAC,EAC/DkD,EAAmBlD,GAAa,CAAC,EACjCe,OAAOC,KAAKmD,GAAWb,SAAQ,SAAUc,GACvC,IACIC,EADSF,EAAUC,GACGH,KAAI,SAAUxD,GACtC,OAAIzD,MAAMoF,QAAQ3B,GACTA,EAAEwD,KAAI,SAAUK,GACrB,MAAsB,kBAAXA,EACFP,WAAWO,GAEbA,CACT,IACsB,kBAAN7D,EACTsD,WAAWtD,GAEbA,CACT,IACAyC,EAAmBlD,GAAWoE,GAAYC,CAC5C,GACF,IACAT,EAAQV,mBAAqBA,CAC/B,CAEA,OAAOrB,EAAM,CAAC,EAAG8B,EAAcC,EACjC,EAQAnF,EAAiB8F,KAAO,SAA8BhC,GACpD,IAAIiC,EAAW,IAAI/F,EAAiB8D,GAyBpC,OAvByBA,EAAcO,oBAAsB,IAC1CQ,SAAQ,SAAUmB,GACnC,GAAIA,EAAMC,SAAU,CAClB,IAAIC,EAAoBH,EAASI,0BAA0BH,EAAMI,MAG/DF,EAAkBjI,OAAS,GACsB,IAAjDiI,EAAkB,GAAGjD,QAAQ+C,EAAMC,YAEnCF,EAAWA,EAASM,iBAAiBL,EAAMI,OAKZ,KADjCF,EAAoBH,EAASI,0BAA0BH,EAAMI,OACvCnI,SACpB8H,EAAWA,EAASO,kCAClBN,EAAMI,KACNJ,EAAMC,UAGZ,CACF,IAEOF,CACT,EAQA/F,EAAiBuG,SAAW,SAAUC,EAAcxF,GAClD,IAAI+C,EAAS/C,GAAc,CAAC,EAE5B,OACEwF,EAAaC,YACb1C,EAAOW,gBACPX,EAAOW,eAAezG,OAAS,EAExB,IAAIE,MACT,qLAKAqI,EAAa9B,eAAezG,OAAS,GAAK8F,EAAO0C,WAC5C,IAAItI,MACT,oKAMFqI,EAAaE,gBACb3C,EAAOU,oBACPvD,EAAc6C,EAAOU,oBAEd,IAAItG,MACT,+KAMA+C,EAAcsF,EAAa/B,qBAAuBV,EAAO2C,eACpD,IAAIvI,MACT,+KAMG,IACT,EAEA6B,EAAiB9C,UAAY,CAC3ByJ,YAAa3G,EAWbqG,iBAAkB,SAA0B9E,GAC1C,IAAIqF,EAAQ,CACVnC,mBAAoBjI,KAAKqK,yBAAyBtF,GAClD+C,kBAAmBf,EAAexB,gBAChCvF,KAAK8H,kBACL/C,EACA,oBAEFgD,eAAgBhB,EAAexB,gBAC7BvF,KAAK+H,eACLhD,EACA,WAEFiD,6BAA8BjB,EAAexB,gBAC3CvF,KAAKgI,6BACLjD,EACA,oBAEFoD,8BAA+BpB,EAAexB,gBAC5CvF,KAAKmI,8BACLpD,EACA,sBAGJ,OACEqF,EAAMnC,qBAAuBjI,KAAKiI,oBAClCmC,EAAMtC,oBAAsB9H,KAAK8H,mBACjCsC,EAAMrC,iBAAmB/H,KAAK+H,gBAC9BqC,EAAMpC,+BACJhI,KAAKgI,8BACPoC,EAAMjC,gCAAkCnI,KAAKmI,8BAEtCnI,KAEFA,KAAKsK,mBAAmBF,EACjC,EAMAG,UAAW,WACT,YAAwBpK,IAApBH,KAAKiK,YAA2D,IAA/BjK,KAAKkI,eAAezG,OAChDzB,KAEFA,KAAKsK,mBAAmB,CAC7BL,gBAAY9J,EACZ+H,eAAgB,IAEpB,EAOAsC,SAAU,SAAkB5G,GAC1B,OAAIA,IAAU5D,KAAK4D,MAAc5D,KAE1BA,KAAKsK,mBAAmB,CAC7B1G,MAAOA,GAEX,EAOA6G,SAAU,SAAkBC,GAC1B,OAAIA,IAAa1K,KAAK2K,MAAc3K,KAE7BA,KAAKsK,mBAAmB,CAC7BK,MAAOD,GAEX,EAOAE,QAAS,SAAiBC,GACxB,OAAIA,IAAY7K,KAAK8K,KAAa9K,KAE3BA,KAAKsK,mBAAmB,CAC7BQ,KAAMD,GAEV,EAQAE,UAAW,SAAmBpD,GAC5B,OAAO3H,KAAKsK,mBAAmB,CAC7B3C,OAAQA,GAEZ,EAQAqD,qBAAsB,SAA8BrD,GAClD,OAAO3H,KAAKsK,mBAAmB,CAC7B1C,kBAAmBD,GAEvB,EAQAsD,eAAgB,SAAwBpK,GACtC,OAAIb,KAAKkL,cAAgBrK,EAAUb,KAE5BA,KAAKsK,mBAAmB,CAC7BY,YAAarK,GAEjB,EAQAsK,iBAAkB,SAA0BC,GAC1C,OAAIpL,KAAKoL,gBAAkBA,EAAsBpL,KAE1CA,KAAKsK,mBAAmB,CAC7Bc,cAAeA,GAEnB,EAkBAC,qBAAsB,SAAUtG,EAAWoE,EAAUnE,GACnD,IAAIsG,EAAMzE,EAAY7B,GAEtB,GAAIhF,KAAKuL,iBAAiBxG,EAAWoE,EAAUmC,GAAM,OAAOtL,KAE5D,IAAIqF,EAAMuB,EAAM,CAAC,EAAG5G,KAAKiI,oBAazB,OAXA5C,EAAIN,GAAa6B,EAAM,CAAC,EAAGvB,EAAIN,IAE3BM,EAAIN,GAAWoE,IAEjB9D,EAAIN,GAAWoE,GAAY9D,EAAIN,GAAWoE,GAAUnH,QAEpDqD,EAAIN,GAAWoE,GAAU7G,KAAKgJ,IAE9BjG,EAAIN,GAAWoE,GAAY,CAACmC,GAGvBtL,KAAKsK,mBAAmB,CAC7BrC,mBAAoB5C,GAExB,EAMAmG,0BAA2B,SAAUC,GACnC,OAAKzL,KAAK0L,mBAAmBD,IAGtBzL,KAAK8H,kBAAkB2D,IAFrB,EAGX,EAMAE,0BAA2B,SAAUF,GACnC,OAAKzL,KAAK4L,mBAAmBH,IAGtBzL,KAAKgI,6BAA6ByD,IAFhC,EAGX,EAMA9B,0BAA2B,SAAU8B,GAGnC,OAAOzL,KAAKmI,8BAA8BsD,IAAc,EAC1D,EAMAI,sBAAuB,SAAUJ,GAC/B,OAAKzL,KAAK0L,mBAAmBD,IAGtBzL,KAAK+H,eAAe0D,IAFlB,EAGX,EAUAK,wBAAyB,SAAU/G,EAAWoE,EAAU4C,GACtD,IAAIC,EAAaD,EACjB,YAAmB5L,IAAf6L,EACGhM,KAAKuL,iBAAiBxG,EAAWoE,EAAU6C,GAGzChM,KAAKsK,mBAAmB,CAC7BrC,mBAAoBjI,KAAKqK,0BAAyB,SAChDrF,EACA7B,GAEA,OACEA,IAAQ4B,GACRC,EAAMiH,KAAO9C,GACbnC,EAAyBhC,EAAMsG,IAAKzE,EAAYmF,GAEpD,MAZOhM,UAcaG,IAAbgJ,EACJnJ,KAAKuL,iBAAiBxG,EAAWoE,GAC/BnJ,KAAKsK,mBAAmB,CAC7BrC,mBAAoBjI,KAAKqK,0BAAyB,SAChDrF,EACA7B,GAEA,OAAOA,IAAQ4B,GAAaC,EAAMiH,KAAO9C,CAC3C,MAPsDnJ,KAWrDA,KAAKuL,iBAAiBxG,GACpB/E,KAAKsK,mBAAmB,CAC7BrC,mBAAoBjI,KAAKqK,0BAAyB,SAAUrF,EAAO7B,GACjE,OAAOA,IAAQ4B,CACjB,MAJ4C/E,IAMhD,EAMAkM,sBAAuB,SAAUT,GAC/B,OAAOzL,KAAKiI,mBAAmBwD,IAAc,CAAC,CAChD,EAOAU,qBAAsB,SAAUpH,EAAWoE,GACzC,OACEnJ,KAAKiI,mBAAmBlD,IACxB/E,KAAKiI,mBAAmBlD,GAAWoE,EAEvC,EAWAkB,yBAA0B,SAAkCtF,GAC1D,QAAkB5E,IAAd4E,EACF,OAAKL,EAAc1E,KAAKiI,oBAGjB,CAAC,EAFCjI,KAAKiI,mBAGT,GAAyB,kBAAdlD,EAChB,OAAOJ,EAAK3E,KAAKiI,mBAAoB,CAAClD,IACjC,GAAyB,oBAAdA,EAA0B,CAC1C,IAAIa,GAAa,EACbqC,EAAqBjI,KAAKiI,mBAC1BmE,EAAwBtG,OAAOC,KAAKkC,GAAoBjC,QAC1D,SAAUC,EAAM9C,GACd,IAAI+F,EAAYjB,EAAmB9E,GAC/BkJ,EAAe,CAAC,EAsBpB,OApBAnD,EAAYA,GAAa,CAAC,EAC1BpD,OAAOC,KAAKmD,GAAWb,SAAQ,SAAUc,GACvC,IAAIjD,EAASgD,EAAUC,IAAa,GAChCmD,EAAY,GAChBpG,EAAOmC,SAAQ,SAAUrD,GACDD,EACpB,CAAEuG,IAAKtG,EAAOiH,GAAI9C,GAClBhG,EACA,YAEoBmJ,EAAUhK,KAAK0C,EACvC,IACIsH,EAAU7K,SAAWyE,EAAOzE,SAC9BmE,GAAa,GAEfyG,EAAalD,GAAYmD,CAC3B,IAEArG,EAAK9C,GAAOkJ,EAELpG,CACT,GACA,CAAC,GAGH,OAAIL,EAAmBwG,EAChBpM,KAAKiI,kBACd,CAKF,EAQAsE,SAAU,SAAkB/C,GAC1B,OAAIxJ,KAAK0L,mBAAmBlC,GACnBxJ,KAGFA,KAAKsK,mBAAmB,CAC7B3C,OAAQ3H,KAAK2H,OAAOvC,OAAO,CAACoE,KAEhC,EAQAgD,oBAAqB,SAA6BhD,GAChD,OAAIxJ,KAAK4L,mBAAmBpC,GACnBxJ,KAGFA,KAAKsK,mBAAmB,CAC7B1C,kBAAmB5H,KAAK4H,kBAAkBxC,OAAO,CAACoE,KAEtD,EASAiD,qBAAsB,SAA8BC,GAClD,GAAI1M,KAAK2M,oBAAoBD,EAAkB9C,MAC7C,MAAM,IAAIjI,MACR,+DACE+K,EAAkB9C,KAClB,KAIN,OAAO5J,KAAKsK,mBAAmB,CAC7BzC,mBAAoB7H,KAAK6H,mBAAmBzC,OAAO,CAACsH,KAExD,EAQAE,mBAAoB,SAA4BpD,EAAOxE,GACrD,IAAKhF,KAAK0L,mBAAmBlC,GAC3B,MAAM,IAAI7H,MACR6H,EACE,uEAGN,OAAIzC,EAAe9B,UAAUjF,KAAK8H,kBAAmB0B,EAAOxE,GACnDhF,KAEFA,KAAKsK,mBAAmB,CAC7BxC,kBAAmBf,EAAelC,cAChC7E,KAAK8H,kBACL0B,EACAxE,IAGN,EAQA6H,qBAAsB,SAA8BrD,EAAOxE,GACzD,IAAKhF,KAAK0L,mBAAmBlC,GAC3B,MAAM,IAAI7H,MACR6H,EACE,uEAGN,OAAIzC,EAAe9B,UAAUjF,KAAK+H,eAAgByB,EAAOxE,GAChDhF,KAEFA,KAAKsK,mBAAmB,CAC7BvC,eAAgBhB,EAAelC,cAC7B7E,KAAK+H,eACLyB,EACAxE,IAGN,EAQA8H,8BAA+B,SAC7BtD,EACAxE,GAEA,IAAKhF,KAAK4L,mBAAmBpC,GAC3B,MAAM,IAAI7H,MACR6H,EACE,kFAIN,OACEzC,EAAe9B,UAAUjF,KAAKgI,6BAA8BwB,EAAOxE,GAE5DhF,KAEFA,KAAKsK,mBAAmB,CAC7BtC,6BAA8BjB,EAAelC,cAC3C7E,KAAKgI,6BACLwB,EACAxE,IAGN,EAMA+H,iBAAkB,SAA0BC,GAC1C,GAAIhN,KAAKiN,aAAaD,GAAM,OAAOhN,KAEnC,IAAIkN,EAAe,CACjBhF,eAAgBlI,KAAKkI,eAAe9C,OAAO4H,IAG7C,OAAOhN,KAAKsK,mBAAmB4C,EACjC,EAQAC,YAAa,SAAqB3D,GAChC,OAAKxJ,KAAK0L,mBAAmBlC,GAItBxJ,KAAK6J,iBAAiBL,GAAOc,mBAAmB,CACrD3C,OAAQ3H,KAAK2H,OAAOvB,QAAO,SAAUX,GACnC,OAAOA,IAAM+D,CACf,MANOxJ,IAQX,EAQAoN,uBAAwB,SAAgC5D,GACtD,OAAKxJ,KAAK4L,mBAAmBpC,GAItBxJ,KAAK6J,iBAAiBL,GAAOc,mBAAmB,CACrD1C,kBAAmB5H,KAAK4H,kBAAkBxB,QAAO,SAAUX,GACzD,OAAOA,IAAM+D,CACf,MANOxJ,IAQX,EAQAqN,wBAAyB,SAAiC7D,GACxD,OAAKxJ,KAAK2M,oBAAoBnD,GAIvBxJ,KAAK6J,iBAAiBL,GAAOc,mBAAmB,CACrDzC,mBAAoB7H,KAAK6H,mBAAmBzB,QAAO,SAAUX,GAC3D,OAAOA,EAAEmE,OAASJ,CACpB,MANOxJ,IAQX,EAUAsN,sBAAuB,SAA+B9D,EAAOxE,GAC3D,IAAKhF,KAAK0L,mBAAmBlC,GAC3B,MAAM,IAAI7H,MACR6H,EACE,uEAGN,OAAKzC,EAAe9B,UAAUjF,KAAK8H,kBAAmB0B,EAAOxE,GAGtDhF,KAAKsK,mBAAmB,CAC7BxC,kBAAmBf,EAAezB,iBAChCtF,KAAK8H,kBACL0B,EACAxE,KANKhF,IASX,EAQAuN,wBAAyB,SAAiC/D,EAAOxE,GAC/D,IAAKhF,KAAK0L,mBAAmBlC,GAC3B,MAAM,IAAI7H,MACR6H,EACE,uEAGN,OAAKzC,EAAe9B,UAAUjF,KAAK+H,eAAgByB,EAAOxE,GAGnDhF,KAAKsK,mBAAmB,CAC7BvC,eAAgBhB,EAAezB,iBAC7BtF,KAAK+H,eACLyB,EACAxE,KANKhF,IASX,EAQAwN,iCAAkC,SAChChE,EACAxE,GAEA,IAAKhF,KAAK4L,mBAAmBpC,GAC3B,MAAM,IAAI7H,MACR6H,EACE,kFAGN,OACGzC,EAAe9B,UAAUjF,KAAKgI,6BAA8BwB,EAAOxE,GAI/DhF,KAAKsK,mBAAmB,CAC7BtC,6BAA8BjB,EAAezB,iBAC3CtF,KAAKgI,6BACLwB,EACAxE,KANKhF,IASX,EAOAyN,oBAAqB,SAA6BT,GAChD,IAAKhN,KAAKiN,aAAaD,GAAM,OAAOhN,KAEpC,IAAIkN,EAAe,CACjBhF,eAAgBlI,KAAKkI,eAAe9B,QAAO,SAAUsH,GACnD,OAAOA,IAAMV,CACf,KAGF,OAAOhN,KAAKsK,mBAAmB4C,EACjC,EAUAxH,iBAAkB,SAA0B8D,EAAOxE,GACjD,OAAOhF,KAAK2N,sBAAsBnE,EAAOxE,EAC3C,EASA2I,sBAAuB,SAA+BnE,EAAOxE,GAC3D,GAAIhF,KAAK2M,oBAAoBnD,GAC3B,OAAOxJ,KAAK8J,kCAAkCN,EAAOxE,GAChD,GAAIhF,KAAK0L,mBAAmBlC,GACjC,OAAOxJ,KAAK4N,iCAAiCpE,EAAOxE,GAC/C,GAAIhF,KAAK4L,mBAAmBpC,GACjC,OAAOxJ,KAAK6N,iCAAiCrE,EAAOxE,GAGtD,MAAM,IAAIrD,MACR,sCACE6H,EACA,6FAEN,EAQAoE,iCAAkC,SAChCpE,EACAxE,GAEA,IAAKhF,KAAK0L,mBAAmBlC,GAC3B,MAAM,IAAI7H,MACR6H,EACE,uEAIN,OAAOxJ,KAAKsK,mBAAmB,CAC7BxC,kBAAmBf,EAAerB,iBAChC1F,KAAK8H,kBACL0B,EACAxE,IAGN,EAQA8I,6BAA8B,SAC5BtE,EACAxE,GAEA,IAAKhF,KAAK0L,mBAAmBlC,GAC3B,MAAM,IAAI7H,MACR6H,EACE,uEAIN,OAAOxJ,KAAKsK,mBAAmB,CAC7BvC,eAAgBhB,EAAerB,iBAC7B1F,KAAK+H,eACLyB,EACAxE,IAGN,EAQA6I,iCAAkC,SAChCrE,EACAxE,GAEA,IAAKhF,KAAK4L,mBAAmBpC,GAC3B,MAAM,IAAI7H,MACR6H,EACE,kFAIN,OAAOxJ,KAAKsK,mBAAmB,CAC7BtC,6BAA8BjB,EAAerB,iBAC3C1F,KAAKgI,6BACLwB,EACAxE,IAGN,EAQA8E,kCAAmC,SACjCN,EACAxE,GAEA,IAAKhF,KAAK2M,oBAAoBnD,GAC5B,MAAM,IAAI7H,MACR6H,EACE,mFAIN,IAAIuE,EAAY/N,KAAKgO,+BACnBhO,KAAKiO,2BAA2BzE,IAG9BnE,EAAM,CAAC,EA2BX,YAxBgDlF,IAA9CH,KAAKmI,8BAA8BqB,IACnCxJ,KAAKmI,8BAA8BqB,GAAO/H,OAAS,IAGlDzB,KAAKmI,8BAA8BqB,GAAO,KAAOxE,GAO1C,IAFNhF,KAAKmI,8BAA8BqB,GAAO,GAAG/C,QAC3CzB,EAAQ+I,KAIsB,IAA9B/I,EAAMyB,QAAQsH,GAEhB1I,EAAImE,GAAS,GAEbnE,EAAImE,GAAS,CAACxE,EAAMhD,MAAM,EAAGgD,EAAMkJ,YAAYH,KAGjD1I,EAAImE,GAAS,CAACxE,GAGThF,KAAKsK,mBAAmB,CAC7BnC,8BAA+B1D,EAC7B,CAAC,EACDY,EACArF,KAAKmI,gCAGX,EASAgG,+BAAgC,SAAU3E,EAAO4E,GAC/C,GAAIpO,KAAKqO,2BAA2B7E,GAClC,MAAM,IAAI7H,MAAM6H,EAAQ,wBAE1B,IAAKxJ,KAAK2M,oBAAoBnD,GAC5B,MAAM,IAAI7H,MACR6H,EACE,oFAGN,IAAInE,EAAM,CAAC,EAEX,OADAA,EAAImE,GAAS,CAAC4E,GACPpO,KAAKsK,mBAAmB,CAC7BnC,8BAA+B1D,EAC7B,CAAC,EACDY,EACArF,KAAKmI,gCAGX,EAQAmG,kCAAmC,SAAU9E,GAC3C,IAAKxJ,KAAKqO,2BAA2B7E,GACnC,OAAOxJ,KAET,IAAIqF,EAAM,CAAC,EAEX,OADAA,EAAImE,GAAS,GACNxJ,KAAKsK,mBAAmB,CAC7BnC,8BAA+B1D,EAC7B,CAAC,EACDY,EACArF,KAAKmI,gCAGX,EAOAoG,oBAAqB,SAA6BvB,GAChD,OAAIhN,KAAKiN,aAAaD,GACbhN,KAAKyN,oBAAoBT,GAG3BhN,KAAK+M,iBAAiBC,EAC/B,EAOApB,mBAAoB,SAAUpC,GAC5B,OAAOxJ,KAAK4H,kBAAkBnB,QAAQ+C,IAAU,CAClD,EAOAmD,oBAAqB,SAAUlB,GAC7B,YAAsDtL,IAA/CH,KAAKiO,2BAA2BxC,EACzC,EAOAC,mBAAoB,SAAUlC,GAC5B,OAAOxJ,KAAK2H,OAAOlB,QAAQ+C,IAAU,CACvC,EAUAgF,eAAgB,SAAwBhF,EAAOxE,GAC7C,QAAKhF,KAAK0L,mBAAmBlC,IAGtBzC,EAAe9B,UAAUjF,KAAK8H,kBAAmB0B,EAAOxE,EACjE,EAWAyJ,iBAAkB,SAA0BjF,EAAOxE,GACjD,QAAKhF,KAAK0L,mBAAmBlC,IAGtBzC,EAAe9B,UAAUjF,KAAK+H,eAAgByB,EAAOxE,EAC9D,EAUA0J,0BAA2B,SAAmClF,EAAOxE,GACnE,QAAKhF,KAAK4L,mBAAmBpC,IAGtBzC,EAAe9B,UACpBjF,KAAKgI,6BACLwB,EACAxE,EAEJ,EAUAqJ,2BAA4B,SAC1B7E,EACAxE,GAEA,IAAKhF,KAAK2M,oBAAoBnD,GAC5B,OAAO,EAGT,IAAImF,EAAc3O,KAAK2J,0BAA0BH,GAEjD,OAAKxE,GAIkC,IAAhC2J,EAAYlI,QAAQzB,GAHlB2J,EAAYlN,OAAS,CAIhC,EAWA8J,iBAAkB,SAA0BxG,EAAWoE,EAAUnE,GAC/D,QAAc7E,IAAV6E,QAAoC7E,IAAbgJ,EACzB,OAAO5C,QAAQvG,KAAKiI,mBAAmBlD,IAGzC,IAAI6J,EACF5O,KAAKiI,mBAAmBlD,SACyB5E,IAAjDH,KAAKiI,mBAAmBlD,GAAWoE,GAErC,QAAchJ,IAAV6E,IAAwB4J,EAC1B,OAAOA,EAGT,IAr1CeC,EAAOC,EAq1ClBjG,EAAchC,EAAY7B,GAC1B+J,OAEF5O,KAx1Ca0O,EAu1CH7O,KAAKiI,mBAAmBlD,GAAWoE,GAv1CzB2F,EAu1CoCjG,EAt1CrDnC,EAAKmI,GAAO,SAAUG,GAC3B,OAAOhI,EAAyBgI,EAAcF,EAChD,KAu1CE,OAAOF,GAAqBG,CAC9B,EAOA9B,aAAc,SAAsBD,GAClC,OAA6C,IAAtChN,KAAKkI,eAAezB,QAAQuG,EACrC,EAQAiC,4BAA6B,WAE3B,IAAI7G,EAAOpI,KAGPkP,EAAkCvI,EACpCb,OAAOC,KAAK/F,KAAKiI,oBAAoB7B,QAAO,SAAUoD,GACpD,OAAO1D,OAAOC,KAAKqC,EAAKH,mBAAmBuB,IAAQ/H,OAAS,CAC9D,IACAzB,KAAK4H,mBAGP,OAAO9B,OAAOC,KAAK/F,KAAKgI,8BACrB5B,QAAO,SAAUoD,GAChB,OAAOpB,EAAKJ,6BAA6BwB,GAAO/H,OAAS,CAC3D,IACC2D,OAAO8J,GACP9J,OAAOpF,KAAKmP,gCACZC,MACL,EAQAD,6BAA8B,WAE5B,IAAI/G,EAAOpI,KACX,OAAO2G,EAGL3G,KAAK6H,mBAAmBmB,KAAI,SAAUQ,GACpC,OAAOA,EAAMI,IACf,IACA9D,OAAOC,KAAK/F,KAAKmI,+BAA+B/B,QAAO,SAAUoD,GAC/D,OAAOpB,EAAKD,8BAA8BqB,GAAO/H,OAAS,CAC5D,KACA2N,MACJ,EAMAC,8BAA+B,WAC7B,IAAIC,EAAgBtP,KAAKiP,8BAEzB,OAAOjP,KAAK4H,kBAAkBxB,QAAO,SAAUX,GAC7C,OAAqC,IAA9B6J,EAAc7I,QAAQhB,EAC/B,GACF,EAEA8J,kBAAmB,CACjB,QAEA,SACA,oBACA,oBACA,qBACA,iBAEA,+BACA,qBACA,iBACA,iCAGFC,eAAgB,WACd,IAAID,EAAoBvP,KAAKuP,kBAEzBE,EAAc,CAAC,EAGfrH,EAAOpI,KAWX,OAVA8F,OAAOC,KAAK/F,MAAMqI,SAAQ,SAAUC,GAClC,IAAI0D,EAAa5D,EAAKE,IAEsB,IAA1CiH,EAAkB9I,QAAQ6B,SACXnI,IAAf6L,IAEAyD,EAAYnH,GAAa0D,EAE7B,IAEOyD,CACT,EAWAC,kBAAmB,SAAsBC,EAAW3K,GAClD,GAAIhF,KAAK2P,KAAe3K,EAAO,OAAOhF,KAEtC,IAAIkN,EAAe,CAAC,EAIpB,OAFAA,EAAayC,GAAa3K,EAEnBhF,KAAKsK,mBAAmB4C,EACjC,EAOA5C,mBAAoB,SAA4B/C,GAC9C,IAAKA,EAAQ,OAAOvH,KAEpB,IAAIwB,EAAQgC,EAAiBuG,SAAS/J,KAAMuH,GAE5C,GAAI/F,EACF,MAAMA,EAIR,IAAI4G,EAAOpI,KACP4P,EAAkBpM,EAAiBgE,cAAcD,GACjDsI,EAAsB/J,OAAOC,KAAK/F,MAAMgG,QAAO,SAAU8J,EAAK3M,GAEhE,OADA2M,EAAI3M,GAAOiF,EAAKjF,GACT2M,CACT,GAAG,CAAC,GAEAC,EAAkBjK,OAAOC,KAAK6J,GAAiB5J,QAAO,SACxDgK,EACA7M,GAEA,IAAI8M,OAA2C9P,IAAlB6P,EAAS7M,GAClC+M,OAA8C/P,IAAzByP,EAAgBzM,GAEzC,OAAI8M,IAA2BC,EACtBvL,EAAKqL,EAAU,CAAC7M,KAGrB+M,IACFF,EAAS7M,GAAOyM,EAAgBzM,IAG3B6M,EACT,GACAH,GAEA,OAAO,IAAI7P,KAAKmK,YAAY4F,EAC9B,EAQAI,UAAW,WACT,YAAkBhQ,IAAdH,KAAK8K,KACA9K,KAGFA,KAAK4K,QAAQ,EACtB,EAOAwF,4BAA6B,SAAU1D,GACrC,OAAOA,EAAkB2D,QAAU,CAAC,iBAAkB,WACxD,EAQArC,+BAAgC,SAAUtB,GACxC,OAAOA,EAAkBqB,WAAa,KACxC,EAQAuC,yBAA0B,SAAU5D,GAClC,OAAOA,EAAkBjD,UAAY,IACvC,EAQA8G,gCAAiC,SAAU7D,GACzC,MAAiD,mBAAtCA,EAAkB8D,iBACpB9D,EAAkB8D,eAG7B,EAOAvC,2BAA4B,SAAUwC,GACpC,OAAO/J,EAAK1G,KAAK6H,oBAAoB,SAAUpC,GAC7C,OAAOA,EAAEmE,OAAS6G,CACpB,GACF,EAOAC,+BAAgC,SAAUjF,GACxC,IAAKzL,KAAK2M,oBAAoBlB,GAC5B,MAAO,GAGT,IAAIkF,EAAa3Q,KAAK2J,0BAA0B8B,GAAW,GAC3D,IAAKkF,EAAY,MAAO,GAExB,IAAI5C,EAAY/N,KAAKgO,+BACnBhO,KAAKiO,2BAA2BxC,IAGlC,OADWkF,EAAWC,MAAM7C,GAChB/E,KAAI,SAAU6H,GACxB,OAAOA,EAAKC,MACd,GACF,EAEAC,SAAU,WACR,OAAOC,KAAKC,UAAUjR,KAAM,KAAM,EACpC,GAYFQ,EAAOC,QAAU+C,sCCppDjBhD,EAAOC,QASP,SAAuByQ,GACrB,OAAO,SAAkBC,EAAyBC,GAChD,IAAI1E,EAAoBwE,EAAMrJ,mBAAmBuJ,GAC7CC,EACDH,EAAM/I,8BAA8BuE,EAAkB9C,OACrDsH,EAAM/I,8BAA8BuE,EAAkB9C,MAAM,IAC9D,GACE0H,EACFJ,EAAMlD,+BAA+BtB,GACnC6E,EACFL,EAAMZ,yBAAyB5D,GAC7B8E,EACFN,EAAMX,gCAAgC7D,GACpC2D,EAASoB,EACXP,EAAMd,4BAA4B1D,IAGhCgF,EAAiBP,EAAwB/J,OAAM,SAAUuK,GAC3D,OAAOA,EAAYC,UACrB,IAEIC,EA4BR,SACExB,EACAiB,EACAC,EACAC,EACA9H,GAEA,OAAO,SACLoI,EACAX,EACAY,GAEA,IAAIC,EAASF,EAEb,GAAIC,EAA2B,EAAG,CAChC,IAAIE,EAAQ,EAIZ,IAFAD,EAASF,EAEFG,EAAQF,GAA0B,CAIvC,IAAIG,EAAOF,GAAUjQ,MAAMoF,QAAQ6K,EAAOE,MAAQF,EAAOE,KAAO,GAChEF,EAAStL,EAAKwL,GAAM,SAAUC,GAC5B,OAAOA,EAAQlN,SACjB,IACAgN,GACF,CACF,CAGA,GAAID,EAAQ,CAYV,IAAII,EAAStM,OAAOC,KAAKoL,EAAwBe,MAC9ClJ,KAAI,SAAUqJ,GACb,MAAO,CAACA,EAAYlB,EAAwBe,KAAKG,GACnD,IACCjM,QAAO,SAAUkM,GAEhB,OAiCV,SACED,EACAE,EACA7I,EACA4H,EACAC,EACAC,GAGA,GACED,IAC8C,IAA7Cc,EAAW5L,QAAQ8K,IAClBA,IAAyBc,GAE3B,OAAO,EAIT,OACId,IAC+C,IAA/Cc,EAAW5L,QAAQ6K,IAEpBC,GACCc,EAAWzB,MAAMU,GAAuB7P,OACtC8P,EAAqBX,MAAMU,GAAuB7P,SAClD,IAG4C,IAA/C4Q,EAAW5L,QAAQ6K,KACoC,IAAtD5H,EAAkBjD,QAAQ6K,IAEc,IAA1C5H,EAAkBjD,QAAQ4L,IAEkC,IAA3DA,EAAW5L,QAAQ8L,EAAajB,KAC9BE,GAC2C,IAA1Ca,EAAW5L,QAAQiD,GAE3B,CAtEiB8I,CADUF,EAAM,GAGrBN,EAAO5D,MAAQmD,EACf7H,EACA4H,EACAC,EACAC,EAEJ,IAEFQ,EAAOE,KAAOO,EACZL,EAAOpJ,KAAI,SAAUsJ,GACnB,IAAID,EAAaC,EAAM,GAGvB,OAyDV,SACEI,EACAL,EACAf,EACA5H,EACAkI,GAEA,IAAIe,EAAQN,EAAWzB,MAAMU,GAC7B,MAAO,CACL1H,KAAM+I,EAAMA,EAAMlR,OAAS,GAAGqP,OAC9B1C,KAAMiE,EACNO,aAAcC,EAAiBR,GAC/BS,MAAOJ,EACPzN,UACEyE,IAAsB2I,GAC4C,IAAlE3I,EAAkBjD,QAAQ4L,EAAaf,GACzCM,WAAYA,EACZM,KAAM,KAEV,CA5EiBa,CAFUT,EAAM,GAIrBD,EACAf,EACA0B,EAAmBtJ,GACnByH,EAAwBS,WAE5B,IACAvB,EAAO,GACPA,EAAO,GAEX,CAEA,OAAOyB,CACT,CACF,CA5GyBmB,CACnB5C,EACAiB,EACAC,EACAC,EACAH,GAGE6B,EAAU/B,EAQd,OANII,IACF2B,EAAU/B,EAAwBnP,MAChCuP,EAAqBX,MAAMU,GAAuB7P,SAI/CyR,EAAQlN,OAAO6L,EAAgB,CACpCjI,KAAMsH,EAAMrJ,mBAAmBuJ,GAAwBxH,KACvDkJ,MAAO,KACP7N,WAAW,EACXmJ,KAAM,KACNwE,aAAc,KACdhB,WAAYF,EACZQ,KAAM,MAEV,CACF,EAtDA,IAAIiB,EAAK,EAAQ,OACbzM,EAAO,EAAQ,MACf+K,EAAiC,EAAQ,OACzCgB,EAAU,EAAQ,OAClBI,EAAmBM,EAAGN,iBACtBG,EAAqBG,EAAGH,uDCP5B,IAAII,EAAU,EAAQ,OAClB3O,EAAe,EAAQ,OACvB0O,EAAK,EAAQ,OACbzM,EAAO,EAAQ,MACf2M,EAAY,EAAQ,MACpBC,EAAa,EAAQ,OACrB1M,EAAQ,EAAQ,OAChB6L,EAAU,EAAQ,OAClBI,EAAmBM,EAAGN,iBACtBG,EAAqBG,EAAGH,mBAExBC,EAA2B,EAAQ,OAgDvC,SAASM,EAAWC,GAClB,IAAIC,EAAU,CAAC,EAMf,OAJAD,EAAWnL,SAAQ,SAAUiD,EAAKoI,GAChCD,EAAQnI,GAAOoI,CACjB,IAEOD,CACT,CAEA,SAASE,EAAiBC,EAAMC,EAAY1Q,GACtC0Q,GAAcA,EAAW1Q,KAC3ByQ,EAAKE,MAAQD,EAAW1Q,GAE5B,CA6JA,SAASM,EAAcyN,EAAOgC,EAASa,GACrC,IAAIC,EAAkBd,EAAQ,GAE9BlT,KAAKiU,YAAcf,EAGnB,IAAI9K,EAAOpI,KAGX8F,OAAOC,KAAKiO,GAAiB3L,SAAQ,SAAUlF,GAC7CiF,EAAKjF,GAAO6Q,EAAgB7Q,EAC9B,IAGA2C,OAAOC,KAAKgO,GAAW,CAAC,GAAG1L,SAAQ,SAAUlF,GAC3CiF,EAAKjF,GAAO4Q,EAAQ5Q,EACtB,IA8IAnD,KAAKkU,iBAAmBhB,EAAQlN,QAAO,SAAUmO,EAAKC,GACpD,YAAmCjU,IAA5BiU,EAAOF,iBACVC,EACAA,EAAMC,EAAOF,gBACnB,GAAG,GAMHlU,KAAK4H,kBAAoB,GAKzB5H,KAAK6H,mBAAqBqJ,EAAMrJ,mBAAmBmB,KACjD,WACE,MAAO,EACT,IAMFhJ,KAAK2H,OAAS,GAEd,IAAIC,EAAoBsJ,EAAMjC,8BAE1BoF,EAAgBd,EAAWrC,EAAMvJ,QACjC2M,EAA2Bf,EAAWrC,EAAMtJ,mBAC5C2M,EAAwB,EAKxBC,EAAaR,EAAgBrM,QAAU,CAAC,EAE5C7B,OAAOC,KAAKyO,GAAYnM,SAAQ,SAAUoM,GACxC,IAnVF5M,EACA6M,EAkVMC,EAAmBH,EAAWC,GAE9B/H,GArVN7E,EAsVIqJ,EAAMrJ,mBArVV6M,EAsVID,EApVG/N,EACLmB,GACA,SAAkC6E,GAEhC,OADiBA,EAAkB8G,YAAc,IAC/B/M,QAAQiO,IAA8B,CAC1D,KAkVA,GAAIhI,EAAmB,CAGrB,IAAIkI,EAAalI,EAAkB8G,WAAW/M,QAAQgO,GAClDI,EAAmBxB,EAAUnC,EAAMrJ,oBAAoB,SAAUpC,GACnE,OAAOA,EAAEmE,OAAS8C,EAAkB9C,IACtC,IACAxB,EAAKP,mBAAmBgN,GAAkBD,GAAc,CACtD7P,UAAW0P,EACXvC,KAAMyC,EACN/C,WAAYoC,EAAgBc,sBAEhC,KAAO,CACL,IAEI9R,EAFA+R,GAAoE,IAA/C7D,EAAMtJ,kBAAkBnB,QAAQgO,GACrDO,GAAyD,IAApC9D,EAAMvJ,OAAOlB,QAAQgO,GAG1CM,IACF/R,EAAWsR,EAAyBG,GACpCrM,EAAKR,kBAAkB5E,GAAY,CACjC4G,KAAM6K,EACNvC,KAAMyC,EACN/C,WAAYoC,EAAgBc,uBAE9BnB,EACEvL,EAAKR,kBAAkB5E,GACvBgR,EAAgBiB,aAChBR,IAGAO,IACFhS,EAAWqR,EAAcI,GACzBrM,EAAKT,OAAO3E,GAAY,CACtB4G,KAAM6K,EACNvC,KAAMyC,EACN/C,WAAYoC,EAAgBc,uBAE9BnB,EACEvL,EAAKT,OAAO3E,GACZgR,EAAgBiB,aAChBR,GAGN,CACF,IAGAzU,KAAK6H,mBAAqBuL,EAAQpT,KAAK6H,oBAGvCD,EAAkBS,SAAQ,SAAU6M,GAClC,IAAId,EAASlB,EAAQqB,GACjB5M,EAASyM,GAAUA,EAAOzM,OAASyM,EAAOzM,OAAS,CAAC,EACpD+E,EAAoBwE,EAAMjD,2BAA2BiH,GAGzDpP,OAAOC,KAAK4B,GAAQU,SAAQ,SAAU8M,GACpC,IAEInS,EAFAoS,EAAezN,EAAOwN,GAI1B,GAAIzI,EAAmB,CACrB1J,EAAWqQ,EAAUnC,EAAMrJ,oBAAoB,SAAUpC,GACvD,OAAOA,EAAEmE,OAAS8C,EAAkB9C,IACtC,IACA,IAAIyL,EAAiBhC,EACnBjL,EAAKP,mBAAmB7E,IACxB,SAAUyC,GACR,OAAOA,EAAEV,YAAcoQ,CACzB,IAIF,IAAwB,IAApBE,EACF,OAGFjN,EAAKP,mBAAmB7E,GAAUqS,GAAgBnD,KAAOtL,EACvD,CAAC,EACDwB,EAAKP,mBAAmB7E,GAAUqS,GAAgBnD,KAClDkD,EAEJ,KAAO,CACLpS,EAAWsR,EAAyBa,GAEpC,IAAIG,EACDtB,EAAgBrM,QAAUqM,EAAgBrM,OAAOwN,IAAY,CAAC,EAEjE/M,EAAKR,kBAAkB5E,GAAY,CACjC4G,KAAMuL,EACNjD,KAAMzN,EAAa,CAAC,EAAG2Q,EAAcE,GACrC1D,WAAYwC,EAAOU,uBAErBnB,EACEvL,EAAKR,kBAAkB5E,GACvBoR,EAAOa,aACPE,GAGEjE,EAAMlJ,6BAA6BmN,IACrCjE,EAAMlJ,6BAA6BmN,GAAQ9M,SAAQ,SACjDhC,IAIG+B,EAAKR,kBAAkB5E,GAAUkP,KAAK7L,IACvC6K,EAAMlJ,6BAA6BmN,GAAQ1O,QACzCuM,EAAmB3M,KAChB,IAEL+B,EAAKR,kBAAkB5E,GAAUkP,KAAK7L,GAAmB,EAE7D,GAEJ,CACF,IACAkO,GACF,IAGArD,EAAM/B,+BAA+B9G,SAAQ,SAAUkN,GACrD,IAAI7I,EAAoBwE,EAAMjD,2BAA2BsH,GACrDxH,EAAYmD,EAAMlD,+BAA+BtB,GAEjDhD,EAAoBwH,EAAMvH,0BAA0B4L,GAIzB,IAA7B7L,EAAkBjI,QAClBiI,EAAkB,GAAGkH,MAAM7C,GAAWtM,OAAS,GAKjDyR,EAAQlR,MAAMuS,GAAuBlM,SAAQ,SAAU+L,GACrD,IAAIzM,EAASyM,GAAUA,EAAOzM,OAASyM,EAAOzM,OAAS,CAAC,EAExD7B,OAAOC,KAAK4B,GAAQU,SAAQ,SAAU8M,GACpC,IAAIC,EAAezN,EAAOwN,GACtBnS,EAAWqQ,EAAUnC,EAAMrJ,oBAAoB,SAAUpC,GAC3D,OAAOA,EAAEmE,OAAS8C,EAAkB9C,IACtC,IACIyL,EAAiBhC,EACnBjL,EAAKP,mBAAmB7E,IACxB,SAAUyC,GACR,OAAOA,EAAEV,YAAcoQ,CACzB,IAIF,IAAwB,IAApBE,EAAJ,CAYA,IAAIG,EAAc,CAAC,EAEnB,GAAI9L,EAAkBjI,OAAS,EAAG,CAChC,IAAIgU,EAAO/L,EAAkB,GAAGkH,MAAM7C,GAAW,GACjDyH,EAAYC,GACVrN,EAAKP,mBAAmB7E,GAAUqS,GAAgBnD,KAAKuD,EAC3D,CAEArN,EAAKP,mBAAmB7E,GAAUqS,GAAgBnD,KAAOzN,EACvD+Q,EACAJ,EACAhN,EAAKP,mBAAmB7E,GAAUqS,GAAgBnD,KArBpD,CAuBF,IAEAqC,GACF,GACF,IAGAzO,OAAOC,KAAKmL,EAAMnJ,gBAAgBM,SAAQ,SAAUoD,GAClD,IAAIiK,EAAWxE,EAAMnJ,eAAe0D,GAChCzI,EAAWqR,EAAc5I,GAE7BrD,EAAKT,OAAO3E,GAAY,CACtB4G,KAAM6B,EACNyG,KAAMsC,EAAW/I,GACjBmG,WAAYoC,EAAgBc,uBAE9BY,EAASrN,SAAQ,SAAUgK,GACzBjK,EAAKT,OAAO3E,GAAYoF,EAAKT,OAAO3E,IAAa,CAAE4G,KAAM6B,GACzDrD,EAAKT,OAAO3E,GAAUkP,KAAO9J,EAAKT,OAAO3E,GAAUkP,MAAQ,CAAC,EAC5D9J,EAAKT,OAAO3E,GAAUkP,KAAKG,GAAc,CAC3C,GACF,IAKArS,KAAK6H,mBAAqB7H,KAAK6H,mBAAmBmB,IAChDiK,EAAyB/B,IAM3BlR,KAAK2H,OAASyL,EAAQpT,KAAK2H,QAI3B3H,KAAK4H,kBAAoBwL,EAAQpT,KAAK4H,mBAEtC5H,KAAK2V,OAASzE,CAChB,CA2BA,SAAS0E,EAA6B1C,EAASnO,GAC7C,SAAS8Q,EAAUrM,GACjB,OAAOA,EAAMI,OAAS7E,CACxB,CAEA,GAAImO,EAAQyC,OAAOjK,mBAAmB3G,GAAY,CAChD,IAAIyE,EAAQ9C,EAAKwM,EAAQvL,OAAQkO,GACjC,OAAKrM,EAEE1D,OAAOC,KAAKyD,EAAM0I,MAAMlJ,KAAI,SAAUY,GAC3C,IAAI5E,EAAQ6N,EAAiBjJ,GAC7B,MAAO,CACLA,KAAMA,EACNgJ,aAAc5N,EACd8N,MAAOtJ,EAAM0I,KAAKtI,GAClB3E,UAAWiO,EAAQyC,OAAOnH,eAAezJ,EAAWC,GACpD8Q,WAAY5C,EAAQyC,OAAOlH,iBAAiB1J,EAAW6E,GAE3D,IAXmB,EAYrB,CAAO,GAAIsJ,EAAQyC,OAAO/J,mBAAmB7G,GAAY,CACvD,IAAImQ,EAAmBxO,EAAKwM,EAAQtL,kBAAmBiO,GACvD,OAAKX,EAEEpP,OAAOC,KAAKmP,EAAiBhD,MAAMlJ,KAAI,SAAUY,GACtD,IAAI5E,EAAQ6N,EAAiBjJ,GAC7B,MAAO,CACLA,KAAMA,EACNgJ,aAAc5N,EACd8N,MAAOoC,EAAiBhD,KAAKtI,GAC7B3E,UAAWiO,EAAQyC,OAAOjH,0BAA0B3J,EAAWC,GAEnE,IAV8B,EAWhC,CAAO,GAAIkO,EAAQyC,OAAOhJ,oBAAoB5H,GAAY,CACxD,IAAIgR,EAA0BrP,EAAKwM,EAAQrL,mBAAoBgO,GAC/D,IAAKE,EAAyB,OAAOA,EAErC,IAAIrJ,EACFwG,EAAQyC,OAAO1H,2BAA2BlJ,GACxCgJ,EACFmF,EAAQyC,OAAO3H,+BAA+BtB,GAC5ChD,EAAoBsJ,EACtBE,EAAQyC,OAAOhM,0BAA0B5E,GAAW,IAAM,IAGE,IAA1D2E,EAAkBjD,QAAQiG,EAAkBjD,YAC9CC,EAAoBA,EAAkBsM,QACpCtJ,EAAkBjD,SAAWsE,EAC7B,KAIJ,IAAIkI,EAAyBvM,EAAkBkH,MAAM7C,GAKrD,OAJAkI,EAAuBC,QAAQnR,GAE/BoR,EAAaJ,EAAyBE,EAAwB,GAEvDF,CACT,CAGF,CASA,SAASI,EAAaC,EAAM1M,EAAmB2M,GAC7CD,EAAKnR,UAAYmR,EAAKxM,OAASF,EAAkB2M,GAC7CD,EAAKlE,MACPkE,EAAKlE,KAAK7J,SAAQ,SAAUiO,GAC1BH,EAAaG,EAAO5M,EAAmB2M,EAAQ,EACjD,GAEJ,CAWA,SAASE,EAAQC,EAAQC,EAAMC,EAAOzE,GAGpC,GAFAA,EAAQA,GAAS,EAEblQ,MAAMoF,QAAQsP,GAChB,OAAOD,EAAOC,EAAMC,EAAMzE,IAG5B,IAAKwE,EAAKvE,MAA6B,IAArBuE,EAAKvE,KAAKzQ,OAC1B,OAAOgV,EAGT,IAAIE,EAAWF,EAAKvE,KAAKlJ,KAAI,SAAU4N,GACrC,OAAOL,EAAQC,EAAQI,EAAWF,EAAOzE,EAAQ,EACnD,IACI4E,EAAiBL,EAAOG,EAAUD,EAAMzE,IAE5C,OADcxN,EAAa,CAAEyN,KAAM2E,GAAkBJ,EAEvD,CA2MA,SAASK,EAAyB3Q,EAAWsF,GAC3C,IAAIyG,EAAOxL,EAAKP,GAAW,SAAUqD,GACnC,OAAOA,EAAMI,OAAS6B,CACxB,IACA,OAAOyG,GAAQA,EAAK4B,KACtB,CAwGA,SAASiD,EAAc7F,EAAOjQ,EAAM+V,EAAepN,EAAMqN,GACvD,IAAIzN,EAAQ9C,EAAKuQ,GAAe,SAAUxR,GACxC,OAAOA,EAAEmE,OAASoN,CACpB,IACIlE,EAAQtJ,GAASA,EAAM0I,MAAQ1I,EAAM0I,KAAKtI,GAAQJ,EAAM0I,KAAKtI,GAAQ,EACrEgI,EAAcpI,GAASA,EAAMoI,aAAe,EAEhD,MAAO,CACL3Q,KAAMA,EACN+V,cAAeA,EACfpN,KAAMA,EACNkJ,MAAOA,EACPlB,WAAYA,EAEhB,CAjcAnO,EAAc/C,UAAUwW,eAAiB,SAAUtN,GACjD,SAASiM,EAAUrM,GACjB,OAAOA,EAAMI,OAASA,CACxB,CAEA,OACElD,EAAK1G,KAAK2H,OAAQkO,IAClBnP,EAAK1G,KAAK4H,kBAAmBiO,IAC7BnP,EAAK1G,KAAK6H,mBAAoBgO,EAElC,EAmHApS,EAAc0T,aAAe,CAAC,iBAAkB,aAAc,YA+H9D1T,EAAc/C,UAAU0W,eAAiB,SAAUrS,EAAWlB,GAC5D,IAAIwT,EAAczB,EAA6B5V,KAAM+E,GACrD,GAAKsS,EAAL,CAIA,IASI7D,EATAO,EAAUtP,EAAa,CAAC,EAAGZ,EAAM,CACnCwM,OAAQ5M,EAAc0T,aAGtBG,gBAAiBzT,GAAQA,EAAKwM,UAI5B6C,EAAUlT,KAEd,GAAI+B,MAAMoF,QAAQkQ,GAChB7D,EAAa,CAACzO,QAGdyO,EADaN,EAAQyC,OAAO1H,2BAA2BoJ,EAAYzN,MAC/C4J,WAGtB,OAAO+C,GACL,SAAUrE,EAAMzG,GACd,GAAIsI,EAAQuD,cAAe,CACzB,IAAIA,EAnFZ,SAA0BpE,EAASnO,GACjC,OACEmO,EAAQqE,kBACRrE,EAAQqE,iBAAiBD,eACzBpE,EAAQqE,iBAAiBD,cAAcpR,QACvCgN,EAAQqE,iBAAiBD,cAAcpR,OAAOnB,EAElD,CA4E4ByS,CAAiBtE,EAASzH,GAC9C,GAAI6L,EACF,OAxIV,SAA8BD,EAAaC,GACzC,IAAIG,EAAgB,GAChBC,EAAkB,GAOlBC,GALQL,EAAcM,OAAS,IAKV5R,QAAO,SAAU8J,EAAKlG,EAAMtI,GAEnD,OADAwO,EAAIlG,GAAQtI,EACLwO,CACT,GAAG,CAAC,GAEJuH,EAAYhP,SAAQ,SAAU+N,GAE5B,IAAIxM,EAAOwM,EAAKhI,MAAQgI,EAAKxM,UACFzJ,IAAvBwX,EAAa/N,GACf6N,EAAcE,EAAa/N,IAASwM,EAEpCsB,EAAgBpV,KAAK8T,EAEzB,IAEAqB,EAAgBA,EAAcrR,QAAO,SAAUoD,GAC7C,OAAOA,CACT,IAEA,IACIqO,EADAC,EAAkBR,EAAcQ,gBAEpC,MAAwB,WAApBA,EACKL,GAEPI,EAD6B,UAApBC,EACE,CACT,CAAC,OAAQ,QACT,CAAC,MAAO,QAGC,CAAC,CAAC,SAAU,CAAC,SAGnBL,EAAcrS,OACnBqN,EAAQiF,EAAiBG,EAAS,GAAIA,EAAS,KAEnD,CA4FiBE,CAAqB7F,EAAMoF,EAEtC,CAEA,GAAIvV,MAAMoF,QAAQ4M,EAAQ1D,QAAS,CACjC,IAAIuH,EAAQtE,EAAWS,EAAQ1D,OAAQ5M,EAAc0T,cACrD,OAAO1E,EAAQP,EAAM0F,EAAM,GAAIA,EAAM,GACvC,CAAO,GAA8B,oBAAnB7D,EAAQ1D,OACxB,OAjKR,SAAuBuH,EAAO1F,GAC5B,OAAOA,EAAK9C,KAAKwI,EACnB,CA+JeI,CAAcjE,EAAQ1D,OAAQ6B,GAEvC,MAAM,IAAIvQ,MACR,oHAGJ,GACA0V,EACA7D,EAxCF,CA0CF,EAQA/P,EAAc/C,UAAUuX,cAAgB,SAAUlT,GAChD,OAAI/E,KAAK2V,OAAOjK,mBAAmB3G,GAC1B+R,EAAyB9W,KAAK2H,OAAQ5C,GACpC/E,KAAK2V,OAAO/J,mBAAmB7G,GACjC+R,EAAyB9W,KAAK4H,kBAAmB7C,QADnD,CAKT,EA+BAtB,EAAc/C,UAAUwX,eAAiB,WACvC,IAAIhH,EAAQlR,KAAK2V,OAEbzC,EAAUlT,KACVmY,EAAM,GAoEV,OAlEArS,OAAOC,KAAKmL,EAAMpJ,mBAAmBO,SAAQ,SAAU2O,GACrD9F,EAAMpJ,kBAAkBkP,GAAe3O,SAAQ,SAAUuB,GACvDuO,EAAI7V,KACFyU,EAAc7F,EAAO,QAAS8F,EAAepN,EAAMsJ,EAAQvL,QAE/D,GACF,IAEA7B,OAAOC,KAAKmL,EAAMnJ,gBAAgBM,SAAQ,SAAU2O,GAClD9F,EAAMnJ,eAAeiP,GAAe3O,SAAQ,SAAUuB,GACpDuO,EAAI7V,KACFyU,EAAc7F,EAAO,UAAW8F,EAAepN,EAAMsJ,EAAQvL,QAEjE,GACF,IAEA7B,OAAOC,KAAKmL,EAAMlJ,8BAA8BK,SAAQ,SACtD2O,GAEA9F,EAAMlJ,6BAA6BgP,GAAe3O,SAAQ,SAAUuB,GAClEuO,EAAI7V,KACFyU,EACE7F,EACA,cACA8F,EACApN,EACAsJ,EAAQtL,mBAGd,GACF,IAEA9B,OAAOC,KAAKmL,EAAM/I,+BAA+BE,SAAQ,SACvD2O,GAEA9F,EAAM/I,8BAA8B6O,GAAe3O,SAAQ,SAAUuB,GACnEuO,EAAI7V,KAuEV,SAAmC4O,EAAO8F,EAAepN,EAAMqN,GAC7D,IAAImB,EAAmBlH,EAAMjD,2BAA2B+I,GACpDjJ,EAAYmD,EAAMlD,+BAA+BoK,GACjDxH,EAAQhH,EAAKgH,MAAM7C,GACnBsK,EAAY3R,EAAKuQ,GAAe,SAAUzN,GAC5C,OAAOA,EAAMI,OAASoN,CACxB,IAEIxN,EAAQoH,EAAM5K,QAAO,SAAUsS,EAAmBzH,GACpD,IAAI0H,EACFD,GACA5R,EAAK4R,EAAkBpG,MAAM,SAAUzM,GACrC,OAAOA,EAAEmE,OAASiH,CACpB,IACF,YAAoB1Q,IAAboY,EAAyBA,EAAWD,CAC7C,GAAGD,GAECvF,EAAStJ,GAASA,EAAMsJ,OAAU,EAClClB,EAAcpI,GAASA,EAAMoI,aAAe,EAC5CxD,EAAQ5E,GAASA,EAAM4E,MAAS,GAEpC,MAAO,CACLnN,KAAM,eACN+V,cAAeA,EACfpN,KAAMwE,EACN0E,MAAOA,EACPlB,WAAYA,EAEhB,CAlGQjI,CACEuH,EACA8F,EACApN,EACAsJ,EAAQrL,oBAGd,GACF,IAEA/B,OAAOC,KAAKmL,EAAMjJ,oBAAoBI,SAAQ,SAAU2O,GACtD,IAAI9N,EAAYgI,EAAMjJ,mBAAmB+O,GACzClR,OAAOC,KAAKmD,GAAWb,SAAQ,SAAUc,GACvCD,EAAUC,GAAUd,SAAQ,SAAUrD,GACpCmT,EAAI7V,KAAK,CACPrB,KAAM,UACN+V,cAAeA,EACfpN,KAAM5E,EACNwT,aAAcxT,EACdmE,SAAUA,GAEd,GACF,GACF,IAEA+H,EAAMhJ,eAAeG,SAAQ,SAAUuB,GACrCuO,EAAI7V,KAAK,CAAErB,KAAM,MAAO+V,cAAe,QAASpN,KAAMA,GACxD,IAEOuO,CACT,EAsEA3X,EAAOC,QAAUgD,sCCxnCjB,IAAI1D,EAAe,EAAQ,OAEvBgE,EAAgB,EAAQ,OACxB8O,EAAmB,0BACnBzO,EAAW,EAAQ,OACnBwC,EAAQ,EAAQ,OAChBlC,EAAgB,EAAQ,OACxBC,EAAO,EAAQ,OACf8T,EAAiB,EAAQ,OACzBjV,EAAmB,EAAQ,OAC3BC,EAAgB,EAAQ,OACxBK,EAAU,EAAQ,OAyGtB,SAASP,EAAoBI,EAAQC,EAAOmQ,GACJ,oBAA3BpQ,EAAO+U,iBAChB/U,EAAO+U,gBAAgB,cAAgB5U,EAAU,KAGnD9D,KAAK2Y,UAAUhV,GACf,IAAIE,EAAOkQ,GAAW,CAAC,EACvBlQ,EAAKD,MAAQA,EACb5D,KAAKkR,MAAQ1N,EAAiB8F,KAAKzF,GACnC7D,KAAKmE,YAAc,KACnBnE,KAAK4Y,SAAW,EAChB5Y,KAAK6Y,sBAAwB,EAC7B7Y,KAAK8Y,eAAiB,GACtB9Y,KAAK+Y,kBAAoB,CAC3B,CAszBA,SAASC,EAAelO,GACtB,GAAIA,EAAO,EAAG,MAAM,IAAInJ,MAAM,2BAO9B,OALA3B,KAAKiZ,QAAQ,CACX/H,MAAOlR,KAAKkR,MAAMtG,QAAQE,GAC1BoO,aAAa,IAGRlZ,IACT,CA8MA,SAASmZ,IACP,OAAOnZ,KAAKkR,MAAMpG,IACpB,CA7gCA1G,EAASb,EAAqBxD,GAa9BwD,EAAoB7C,UAAU0Y,OAAS,WAErC,OADApZ,KAAKqZ,QAAQ,CAAEC,wBAAwB,IAChCtZ,IACT,EAEAuD,EAAoB7C,UAAU6Y,6BAA+B,WAE3D,OADAvZ,KAAKqZ,QAAQ,CAAEC,wBAAwB,IAChCtZ,IACT,EAOAuD,EAAoB7C,UAAU8Y,SAAW,WACvC,IAAItI,EAAQlR,KAAKkR,MACjB,OAAOuH,EAAegB,qBAAqBvI,EAC7C,EAsCA3N,EAAoB7C,UAAUgZ,WAAa,SAAU3F,EAAS4F,GAC5D,IAAIC,EAAa7F,EAEb/T,KAAKkR,MAAM5G,mBAAmByJ,GAD9B/T,KAAKkR,MAEL2I,EAAUpB,EAAeqB,YAAYF,EAAUhW,MAAOgW,GAEtDxR,EAAOpI,KAQX,GANAA,KAAK+Y,oBAEL/Y,KAAKgB,KAAK,aAAc,CACtBkQ,MAAO0I,KAGLD,EAuBJ,OAAO3Z,KAAK2D,OAAOyV,OAAOS,GAASE,MACjC,SAAUC,GAGR,OAFA5R,EAAK2Q,oBAC0B,IAA3B3Q,EAAK2Q,mBAAyB3Q,EAAKpH,KAAK,oBACrC,CACLgZ,QAAS,IAAIvW,EAAcmW,EAAWI,EAAQ9G,SAC9ChC,MAAO0I,EACPK,kBAAmBD,EAEvB,IACA,SAAUE,GAGR,MAFA9R,EAAK2Q,oBAC0B,IAA3B3Q,EAAK2Q,mBAAyB3Q,EAAKpH,KAAK,oBACtCkZ,CACR,IApCAla,KAAK2D,OACFyV,OAAOS,GACPE,MAAK,SAAUC,GACd5R,EAAK2Q,oBAC0B,IAA3B3Q,EAAK2Q,mBACP3Q,EAAKpH,KAAK,oBAGZ2Y,EAAG,KAAM,IAAIlW,EAAcmW,EAAWI,EAAQ9G,SAAU0G,EAC1D,IACCO,OAAM,SAAUvY,GACfwG,EAAK2Q,oBAC0B,IAA3B3Q,EAAK2Q,mBACP3Q,EAAKpH,KAAK,oBAGZ2Y,EAAG/X,EAAK,KAAMgY,EAChB,GAqBN,EAaArW,EAAoB7C,UAAU0Z,YAAc,SAAUrG,GAEpDvR,QAAQkF,KAAK,yDACb,IAAIwJ,EAAQlR,KAAKkR,MACbmJ,EAAgBra,KAAK8Y,eAAe,GACxC,IAAKuB,EACH,OAAOC,QAAQC,QAAQ,IAEzB,IAAIC,EAAeH,EAAc9V,iBAAiB2M,GAC9CgB,EAAOtL,EACT,CACE6T,wBAAyB1G,EAAQ0G,wBACjCC,OAAQ3G,EAAQ2G,QAElB,CACEnT,OAAQ5C,EAAK8T,EAAegB,qBAAqBe,GAAe,CAC9D,sBACA,cACA,+BACA,0BAKFG,EACF,8GACF,GAAqC,oBAA1B3a,KAAK2D,OAAOiX,UACrB,MAAM,IAAIjZ,MAAMgZ,GAElB,IAAI/W,EAAQ5D,KAAK2D,OAAOiX,UAAUJ,EAAa5W,OAC/C,GAAiC,oBAAtBA,EAAMwW,YACf,MAAM,IAAIzY,MAAMgZ,GAElB,OAAO/W,EAAMwW,YAAYI,EAAa7P,MAAOoJ,EAAQ8G,eAAgB3I,EACvE,EAoCA3O,EAAoB7C,UAAUoa,qBAAuB,SACnDtR,EACAmB,EACAoQ,EACAC,GAEA,IAAIC,EAA4D,oBAArCjb,KAAK2D,OAAOmX,qBACnCI,EAAsD,oBAA1Blb,KAAK2D,OAAOiX,UAC5C,IACGK,IACAC,GAC6B,oBAAvBlb,KAAK2D,OAAOyV,OAEnB,MAAM,IAAIzX,MACR,yKAIJ,IAAIuP,EAAQlR,KAAKkR,MAAM5G,mBAAmB0Q,GAAa,CAAC,GACpDG,EAAgBjK,EAAMtF,mBAAmBpC,GACzC4R,EAAe3C,EAAe4C,uBAChC7R,EACAmB,EACAoQ,EACA7J,GAGFlR,KAAK+Y,oBAEL,IACIuC,EADAlT,EAAOpI,KAoCX,OAjCIib,EACFK,EAA8Btb,KAAK2D,OAAOmX,qBAAqB,CAC7D,CAAES,UAAWrK,EAAMtN,MAAO2D,OAAQ6T,KAG3BF,EACTI,EAA8Btb,KAAK2D,OAChCiX,UAAU1J,EAAMtN,OAChBkX,qBAAqBM,WAIjBA,EAAa3P,UACpB6P,EAA8Btb,KAAK2D,OAChCyV,OAAO,CACN,CACEnY,KAAM,QACNuI,MAAOA,EACP+R,UAAWrK,EAAMtN,MACjB2D,OAAQ6T,KAGXrB,MAAK,SAAyByB,GAC7B,OAAOA,EAAStI,QAAQ,EAC1B,KAGJlT,KAAKgB,KAAK,uBAAwB,CAChCkQ,MAAOA,EACP1H,MAAOA,EACPmB,MAAOA,IAGF2Q,EAA4BvB,MACjC,SAAsBC,GAapB,OAZA5R,EAAK2Q,oBAC0B,IAA3B3Q,EAAK2Q,mBAAyB3Q,EAAKpH,KAAK,qBAE5CgZ,EAAUjY,MAAMoF,QAAQ6S,GAAWA,EAAQ,GAAKA,GAExCyB,UAAUpT,SAAQ,SAAU5C,GAClCA,EAAEmN,aAAeC,EAAiBpN,EAAET,OACpCS,EAAER,UAAYkW,EACVjK,EAAMxC,0BAA0BlF,EAAO/D,EAAEmN,cACzC1B,EAAM1C,eAAehF,EAAO/D,EAAEmN,aACpC,IAEOoH,CACT,IACA,SAAUE,GAGR,MAFA9R,EAAK2Q,oBAC0B,IAA3B3Q,EAAK2Q,mBAAyB3Q,EAAKpH,KAAK,oBACtCkZ,CACR,GAEJ,EAWA3W,EAAoB7C,UAAU+J,SAAW,SAAUiR,GAMjD,OALA1b,KAAKiZ,QAAQ,CACX/H,MAAOlR,KAAKkR,MAAMf,YAAY1F,SAASiR,GACvCxC,aAAa,IAGRlZ,IACT,EAyBAuD,EAAoB7C,UAAUmJ,iBAAmB,SAAUD,GAMzD,OALA5J,KAAKiZ,QAAQ,CACX/H,MAAOlR,KAAKkR,MAAMf,YAAYtG,iBAAiBD,GAC/CsP,aAAa,IAGRlZ,IACT,EAUAuD,EAAoB7C,UAAU6J,UAAY,WAMxC,OALAvK,KAAKiZ,QAAQ,CACX/H,MAAOlR,KAAKkR,MAAMf,YAAY5F,YAC9B2O,aAAa,IAGRlZ,IACT,EAaAuD,EAAoB7C,UAAUoM,8BAAgC,SAC5DtD,EACAxE,GAOA,OALAhF,KAAKiZ,QAAQ,CACX/H,MAAOlR,KAAKkR,MAAMf,YAAYrD,8BAA8BtD,EAAOxE,GACnEkU,aAAa,IAGRlZ,IACT,EAMAuD,EAAoB7C,UAAUib,qBAAuB,WACnD,OAAO3b,KAAK8M,8BAA8B7K,MAAMjC,KAAM0B,UACxD,EAeA6B,EAAoB7C,UAAUyN,+BAAiC,SAC7D3E,EACA4E,GAOA,OALApO,KAAKiZ,QAAQ,CACX/H,MAAOlR,KAAKkR,MAAMf,YAAYhC,+BAA+B3E,EAAO4E,GACpE8K,aAAa,IAGRlZ,IACT,EAcAuD,EAAoB7C,UAAU2K,qBAAuB,SACnDtG,EACAoE,EACAnE,GASA,OAPAhF,KAAKiZ,QAAQ,CACX/H,MAAOlR,KAAKkR,MACTf,YACA9E,qBAAqBtG,EAAWoE,EAAUnE,GAC7CkU,aAAa,IAGRlZ,IACT,EAaAuD,EAAoB7C,UAAUkM,mBAAqB,SAAUpD,EAAOxE,GAMlE,OALAhF,KAAKiZ,QAAQ,CACX/H,MAAOlR,KAAKkR,MAAMf,YAAYvD,mBAAmBpD,EAAOxE,GACxDkU,aAAa,IAGRlZ,IACT,EAMAuD,EAAoB7C,UAAUkb,UAAY,WACxC,OAAO5b,KAAK4M,mBAAmB3K,MAAMjC,KAAM0B,UAC7C,EAaA6B,EAAoB7C,UAAUmb,kBAAoB,SAAUrS,EAAOxE,GAMjE,OALAhF,KAAKiZ,QAAQ,CACX/H,MAAOlR,KAAKkR,MAAMf,YAAYtD,qBAAqBrD,EAAOxE,GAC1DkU,aAAa,IAGRlZ,IACT,EAMAuD,EAAoB7C,UAAUob,WAAa,WACzC,OAAO9b,KAAK6b,kBAAkB5Z,MAAMjC,KAAM0B,UAC5C,EAYA6B,EAAoB7C,UAAUqb,OAAS,SAAU/O,GAM/C,OALAhN,KAAKiZ,QAAQ,CACX/H,MAAOlR,KAAKkR,MAAMf,YAAYpD,iBAAiBC,GAC/CkM,aAAa,IAGRlZ,IACT,EAoBAuD,EAAoB7C,UAAUoL,wBAA0B,SACtD/G,EACAoE,EACAnE,GASA,OAPAhF,KAAKiZ,QAAQ,CACX/H,MAAOlR,KAAKkR,MACTf,YACArE,wBAAwB/G,EAAWoE,EAAUnE,GAChDkU,aAAa,IAGRlZ,IACT,EAgBAuD,EAAoB7C,UAAU8M,iCAAmC,SAC/DhE,EACAxE,GASA,OAPAhF,KAAKiZ,QAAQ,CACX/H,MAAOlR,KAAKkR,MACTf,YACA3C,iCAAiChE,EAAOxE,GAC3CkU,aAAa,IAGRlZ,IACT,EAMAuD,EAAoB7C,UAAUsb,wBAA0B,WACtD,OAAOhc,KAAKwN,iCAAiCvL,MAAMjC,KAAM0B,UAC3D,EAUA6B,EAAoB7C,UAAU4N,kCAAoC,SAChE9E,GAOA,OALAxJ,KAAKiZ,QAAQ,CACX/H,MAAOlR,KAAKkR,MAAMf,YAAY7B,kCAAkC9E,GAChE0P,aAAa,IAGRlZ,IACT,EAgBAuD,EAAoB7C,UAAU4M,sBAAwB,SAAU9D,EAAOxE,GAMrE,OALAhF,KAAKiZ,QAAQ,CACX/H,MAAOlR,KAAKkR,MAAMf,YAAY7C,sBAAsB9D,EAAOxE,GAC3DkU,aAAa,IAGRlZ,IACT,EAMAuD,EAAoB7C,UAAUub,aAAe,WAC3C,OAAOjc,KAAKsN,sBAAsBrL,MAAMjC,KAAM0B,UAChD,EAgBA6B,EAAoB7C,UAAUwb,qBAAuB,SAAU1S,EAAOxE,GAMpE,OALAhF,KAAKiZ,QAAQ,CACX/H,MAAOlR,KAAKkR,MAAMf,YAAY5C,wBAAwB/D,EAAOxE,GAC7DkU,aAAa,IAGRlZ,IACT,EAMAuD,EAAoB7C,UAAUyb,cAAgB,WAC5C,OAAOnc,KAAKkc,qBAAqBja,MAAMjC,KAAM0B,UAC/C,EAYA6B,EAAoB7C,UAAU0b,UAAY,SAAUpP,GAMlD,OALAhN,KAAKiZ,QAAQ,CACX/H,MAAOlR,KAAKkR,MAAMf,YAAY1C,oBAAoBT,GAClDkM,aAAa,IAGRlZ,IACT,EAaAuD,EAAoB7C,UAAU2b,qBAAuB,SAAU7S,EAAOxE,GAMpE,OALAhF,KAAKiZ,QAAQ,CACX/H,MAAOlR,KAAKkR,MAAMf,YAAYrC,6BAA6BtE,EAAOxE,GAClEkU,aAAa,IAGRlZ,IACT,EAMAuD,EAAoB7C,UAAU4b,cAAgB,WAC5C,OAAOtc,KAAKqc,qBAAqBpa,MAAMjC,KAAM0B,UAC/C,EAiBA6B,EAAoB7C,UAAUgF,iBAAmB,SAAU8D,EAAOxE,GAChE,OAAOhF,KAAK2N,sBAAsBnE,EAAOxE,EAC3C,EAgBAzB,EAAoB7C,UAAUiN,sBAAwB,SAAUnE,EAAOxE,GAMrE,OALAhF,KAAKiZ,QAAQ,CACX/H,MAAOlR,KAAKkR,MAAMf,YAAYxC,sBAAsBnE,EAAOxE,GAC3DkU,aAAa,IAGRlZ,IACT,EAMAuD,EAAoB7C,UAAU6b,aAAe,WAC3C,OAAOvc,KAAK2N,sBAAsB1L,MAAMjC,KAAM0B,UAChD,EAYA6B,EAAoB7C,UAAU8b,UAAY,SAAUxP,GAMlD,OALAhN,KAAKiZ,QAAQ,CACX/H,MAAOlR,KAAKkR,MAAMf,YAAY5B,oBAAoBvB,GAClDkM,aAAa,IAGRlZ,IACT,EAWAuD,EAAoB7C,UAAU+b,SAAW,WACvC,IAAI3R,EAAO9K,KAAKkR,MAAMpG,MAAQ,EAC9B,OAAO9K,KAAK4K,QAAQE,EAAO,EAC7B,EAWAvH,EAAoB7C,UAAUgc,aAAe,WAC3C,IAAI5R,EAAO9K,KAAKkR,MAAMpG,MAAQ,EAC9B,OAAO9K,KAAK4K,QAAQE,EAAO,EAC7B,EA4BAvH,EAAoB7C,UAAUsY,eAAiBA,EAU/CzV,EAAoB7C,UAAUkK,QAAUoO,EAWxCzV,EAAoB7C,UAAU8J,SAAW,SAAUZ,GAMjD,OALA5J,KAAKiZ,QAAQ,CACX/H,MAAOlR,KAAKkR,MAAMf,YAAY3F,SAASZ,GACvCsP,aAAa,IAGRlZ,IACT,EAmBAuD,EAAoB7C,UAAUgP,kBAAoB,SAAUC,EAAW3K,GAMrE,OALAhF,KAAKiZ,QAAQ,CACX/H,MAAOlR,KAAKkR,MAAMf,YAAYT,kBAAkBC,EAAW3K,GAC3DkU,aAAa,IAGRlZ,IACT,EASAuD,EAAoB7C,UAAUic,SAAW,SAAUC,GAMjD,OALA5c,KAAKiZ,QAAQ,CACX/H,MAAO1N,EAAiB8F,KAAKsT,GAC7B1D,aAAa,IAGRlZ,IACT,EAmBAuD,EAAoB7C,UAAUmc,0CAC5B,SAAUD,GAER,OADA5c,KAAKkR,MAAQ,IAAI1N,EAAiBoZ,GAC3B5c,IACT,EAyBFuD,EAAoB7C,UAAUoc,eAAiB,SAAU/X,GACvD,QAAIL,EAAc1E,KAAKkR,MAAMhF,sBAAsBnH,MAExC/E,KAAKkR,MAAMxF,mBAAmB3G,GAChC/E,KAAKkR,MAAM1C,eAAezJ,GACxB/E,KAAKkR,MAAMtF,mBAAmB7G,GAChC/E,KAAKkR,MAAMxC,0BAA0B3J,KACnC/E,KAAKkR,MAAMvE,oBAAoB5H,IACjC/E,KAAKkR,MAAM7C,2BAA2BtJ,GASjD,EAqBAxB,EAAoB7C,UAAUoV,WAAa,SAAUtM,EAAOxE,GAC1D,OAAOhF,KAAKkR,MAAMzC,iBAAiBjF,EAAOxE,EAC5C,EAMAzB,EAAoB7C,UAAUqc,qBAAuB,SAAUvT,EAAOxE,GACpE,OAAOhF,KAAKkR,MAAMxC,0BAA0BlF,EAAOxE,EACrD,EAOAzB,EAAoB7C,UAAUsc,OAAS,SAAUhQ,GAC/C,OAAOhN,KAAKkR,MAAMjE,aAAaD,EACjC,EAMAzJ,EAAoB7C,UAAUuM,aAAe,WAC3C,OAAOjN,KAAKid,kBAAkBhb,MAAMjC,KAAM0B,UAC5C,EASA6B,EAAoB7C,UAAUwc,SAAW,WACvC,OAAOld,KAAKkR,MAAMtN,KACpB,EAWAL,EAAoB7C,UAAUyY,eAAiBA,EAM/C5V,EAAoB7C,UAAUyc,QAAUhE,EAOxC5V,EAAoB7C,UAAU0c,QAAU,WACtC,OAAOpd,KAAKkR,MAAMhJ,cACpB,EA8CA3E,EAAoB7C,UAAUwX,eAAiB,SAAUzM,GACvD,IAAIkD,EAAc,GAElB,GAAI3O,KAAKkR,MAAMxF,mBAAmBD,GACVzL,KAAKkR,MAAM1F,0BAA0BC,GAE3CpD,SAAQ,SAAUgV,GAChC1O,EAAYrM,KAAK,CACf0C,MAAOqY,EACPpc,KAAM,eAEV,IAEyBjB,KAAKkR,MAAMrF,sBAAsBJ,GAEvCpD,SAAQ,SAAUgV,GACnC1O,EAAYrM,KAAK,CACf0C,MAAOqY,EACPpc,KAAM,WAEV,SACK,GAAIjB,KAAKkR,MAAMtF,mBAAmBH,GAAY,CAEjDzL,KAAKkR,MAAMvF,0BAA0BF,GAEhBpD,SAAQ,SAAUgV,GACvC1O,EAAYrM,KAAK,CACf0C,MAAOqY,EACPpc,KAAM,eAEV,GACF,CAEA,IAAIgH,EAAqBjI,KAAKkR,MAAMhF,sBAAsBT,GAY1D,OAVA3F,OAAOC,KAAKkC,GAAoBI,SAAQ,SAAUc,GAChD,IAAInE,EAAQiD,EAAmBkB,GAE/BwF,EAAYrM,KAAK,CACf0C,MAAOA,EACPmE,SAAUA,EACVlI,KAAM,WAEV,IAEO0N,CACT,EAQApL,EAAoB7C,UAAUyL,qBAAuB,SACnDpH,EACAoE,GAEA,OAAOnJ,KAAKkR,MAAM/E,qBAAqBpH,EAAWoE,EACpD,EAOA5F,EAAoB7C,UAAUgQ,+BAAiC,SAC7DjF,GAEA,OAAOzL,KAAKkR,MAAMR,+BAA+BjF,EACnD,EAcAlI,EAAoB7C,UAAU2Y,QAAU,SAAUtF,GAChD,IAAI7C,EAAQlR,KAAKkR,MACboM,EAAS,GACTC,EAAc,GAEbxJ,EAAQuF,yBACXiE,EAAc9E,EAAeqB,YAAY5I,EAAMtN,MAAOsN,GAEtDoM,EAAOhb,KAAK,CACV4O,MAAOA,EACPsM,aAAcD,EAAY9b,OAC1Bgc,OAAQzd,OAGVA,KAAKgB,KAAK,SAAU,CAClBkQ,MAAOA,EACPgC,QAASlT,KAAKmE,eAIlB,IAAIuZ,EAAiB1d,KAAK8Y,eAAe9P,KAAI,SAAUqR,GACrD,IAAIG,EAAeH,EAAc9V,iBAAiB2M,GAC9CyM,EAAsBnD,EAAa5W,MACnC6U,EAAeqB,YAAYU,EAAa5W,MAAO4W,GAC/C,GAaJ,OAXA8C,EAAOhb,KAAK,CACV4O,MAAOsJ,EACPgD,aAAcG,EAAoBlc,OAClCgc,OAAQpD,IAGVA,EAAcrZ,KAAK,SAAU,CAC3BkQ,MAAOsJ,EACPtH,QAASmH,EAAclW,cAGlBwZ,CACT,IAEI9D,EAAU9X,MAAMrB,UAAU0E,OAAOnD,MAAMsb,EAAaG,GAEpDE,EAAU5d,KAAK4Y,WAGnB,GAFA5Y,KAAK+Y,qBAEAc,EAAQpY,OACX,OAAO6Y,QAAQC,QAAQ,CAAErH,QAAS,KAAM6G,KACtC/Z,KAAK6d,yBAAyBC,KAAK9d,KAAMsd,EAAQM,IAIrD,IACE5d,KAAK2D,OACFyV,OAAOS,GACPE,KAAK/Z,KAAK6d,yBAAyBC,KAAK9d,KAAMsd,EAAQM,IACtDzD,MAAMna,KAAK+d,sBAAsBD,KAAK9d,KAAM4d,GACjD,CAAE,MAAOpc,GAEPxB,KAAKgB,KAAK,QAAS,CACjBQ,MAAOA,GAEX,CAGF,EAYA+B,EAAoB7C,UAAUmd,yBAA2B,SACvDP,EACAM,EACA5D,GAIA,KAAI4D,EAAU5d,KAAK6Y,sBAAnB,CAKA7Y,KAAK+Y,mBAAqB6E,EAAU5d,KAAK6Y,qBACzC7Y,KAAK6Y,qBAAuB+E,EAEG,IAA3B5d,KAAK+Y,mBAAyB/Y,KAAKgB,KAAK,oBAE5C,IAAIkS,EAAU8G,EAAQ9G,QAAQlR,QAE9Bsb,EAAOjV,SAAQ,SAAU2V,GACvB,IAAI9M,EAAQ8M,EAAE9M,MACVsM,EAAeQ,EAAER,aACjBC,EAASO,EAAEP,OACXQ,EAAkB/K,EAAQjQ,OAAO,EAAGua,GAEnCtM,EAAMtN,OAQX6Z,EAAOtZ,YAAc,IAAIV,EAAcyN,EAAO+M,GAE9CR,EAAOzc,KAAK,SAAU,CACpBkS,QAASuK,EAAOtZ,YAChB+M,MAAOA,KAXPuM,EAAOzc,KAAK,SAAU,CACpBkS,QAAS,KACThC,MAAOA,GAWb,GA7BA,CA8BF,EAEA3N,EAAoB7C,UAAUqd,sBAAwB,SACpDH,EACApc,GAEIoc,EAAU5d,KAAK6Y,uBAKnB7Y,KAAK+Y,mBAAqB6E,EAAU5d,KAAK6Y,qBACzC7Y,KAAK6Y,qBAAuB+E,EAE5B5d,KAAKgB,KAAK,QAAS,CACjBQ,MAAOA,IAGsB,IAA3BxB,KAAK+Y,mBAAyB/Y,KAAKgB,KAAK,oBAC9C,EAEAuC,EAAoB7C,UAAUwd,mBAAqB,SACjDvT,EACAwT,EACAjU,EACAD,GAEA,OACEU,GACwB,IAAxBwT,EAAa1c,QACa,IAA1ByI,EAAezI,QACO,IAAtBwI,EAAWxI,MAEf,EAQA8B,EAAoB7C,UAAU0d,2BAA6B,SAAU5U,GACnE,OACExJ,KAAKkR,MAAMmN,uBAAuB7U,IAClCxJ,KAAKkR,MAAMmN,uBAAuB7U,GAAO/H,OAAS,CAEtD,EAEA8B,EAAoB7C,UAAUuY,QAAU,SAAUqF,GAChD,IAAIpN,EAAQoN,EAAMpN,MACdgI,EAAcoF,EAAMpF,YAEpBhI,IAAUlR,KAAKkR,QACjBlR,KAAKkR,MAAQA,EAEblR,KAAKgB,KAAK,SAAU,CAClBkQ,MAAOlR,KAAKkR,MACZgC,QAASlT,KAAKmE,YACd+U,YAAaA,IAGnB,EAMA3V,EAAoB7C,UAAU6d,WAAa,WAEzC,OADIve,KAAK2D,OAAO4a,YAAYve,KAAK2D,OAAO4a,aACjCve,IACT,EAQAuD,EAAoB7C,UAAUiY,UAAY,SAAU6F,GAClD,OAAIxe,KAAK2D,SAAW6a,IAEqB,oBAA9BA,EAAU9F,iBACnB8F,EAAU9F,gBAAgB,cAAgB5U,EAAU,KAEtD9D,KAAK2D,OAAS6a,GALwBxe,IAQxC,EAMAuD,EAAoB7C,UAAU+d,UAAY,WACxC,OAAOze,KAAK2D,MACd,EAqBAJ,EAAoB7C,UAAUge,OAAS,SAAUza,GAC/C,IAAIoW,EAAgB,IAAItW,EAAc/D,KAAMiE,GAE5C,OADAjE,KAAK8Y,eAAexW,KAAK+X,GAClBA,CACT,EAUA9W,EAAoB7C,UAAU4D,oBAAsB,SAAU+V,GAC5D,IAAIsE,EAAM3e,KAAK8Y,eAAerS,QAAQ4T,GACtC,IAAa,IAATsE,EAAY,MAAM,IAAIhd,MAAM,mCAChC3B,KAAK8Y,eAAe7V,OAAO0b,EAAK,EAClC,EAMApb,EAAoB7C,UAAUke,mBAAqB,WACjD,OAAO5e,KAAK+Y,kBAAoB,CAClC,EAkBAvY,EAAOC,QAAU8C,kCC7jDjB/C,EAAOC,QAAU,SAAiBoO,GAChC,OAAK9M,MAAMoF,QAAQ0H,GAIZA,EAAMzI,OAAOG,SAHX,EAIX,kCCJA/F,EAAOC,QAAU,WAGf,OAFcsB,MAAMrB,UAAUsB,MAAMF,KAAKJ,WAE1Bmd,aAAY,SAAU/O,EAAKgP,GAWxC,OAVAhZ,OAAOC,KAAKD,OAAOgZ,IAASzW,SAAQ,SAAUlF,QACxBhD,IAAhB2e,EAAO3b,UAGMhD,IAAb2P,EAAI3M,WAEC2M,EAAI3M,GAEb2M,EAAI3M,GAAO2b,EAAO3b,GACpB,IACO2M,CACT,GAAG,CAAC,EACN,kCCMAtP,EAAOC,QAAU,CACfoS,iBAnBF,SAA0B7N,GACxB,MAAqB,kBAAVA,EAA2BA,EAE/B+Z,OAAO/Z,GAAOgR,QAAQ,KAAM,MACrC,EAgBEhD,mBARF,SAA4BhO,GAC1B,MAAqB,kBAAVA,EAA2BA,EAE/BA,EAAMgR,QAAQ,OAAQ,IAC/B,kCCrBAxV,EAAOC,QAAU,SAAcoO,EAAOmQ,GACpC,GAAKjd,MAAMoF,QAAQ0H,GAInB,IAAK,IAAIvN,EAAI,EAAGA,EAAIuN,EAAMpN,OAAQH,IAChC,GAAI0d,EAAWnQ,EAAMvN,IACnB,OAAOuN,EAAMvN,EAKnB,iCCZAd,EAAOC,QAAU,SAAcoO,EAAOmQ,GACpC,IAAKjd,MAAMoF,QAAQ0H,GACjB,OAAQ,EAGV,IAAK,IAAIvN,EAAI,EAAGA,EAAIuN,EAAMpN,OAAQH,IAChC,GAAI0d,EAAWnQ,EAAMvN,IACnB,OAAOA,EAGX,OAAQ,CACV,sCCZA,IAAIoF,EAAO,EAAQ,MAQnBlG,EAAOC,QAAU,SAAoB4P,EAAQ4O,GAC3C,IAAIC,GAAuBD,GAAY,IAAIjW,KAAI,SAAUoG,GACvD,OAAOA,EAAKwB,MAAM,IACpB,IAEA,OAAOP,EAAOrK,QACZ,SAA0BmZ,EAAK/P,GAC7B,IAAIgQ,EAAkBhQ,EAAKwB,MAAM,KAE7ByO,EAAkB3Y,EACpBwY,GACA,SAAUI,GACR,OAAOA,EAAmB,KAAOF,EAAgB,EACnD,IAGF,OAAIA,EAAgB3d,OAAS,IAAM4d,GACjCF,EAAI,GAAG7c,KAAK8c,EAAgB,IAC5BD,EAAI,GAAG7c,KAAK8c,EAAgB,IACrBD,IAGTA,EAAI,GAAG7c,KAAK+c,EAAgB,IAC5BF,EAAI,GAAG7c,KAAK+c,EAAgB,IACrBF,EACT,GACA,CAAC,GAAI,IAET,kCCzBA3e,EAAOC,QAXP,SAAkB8e,EAAMC,GACtBD,EAAK7e,UAAYoF,OAAO2Z,OAAOD,EAAU9e,UAAW,CAClDyJ,YAAa,CACXnF,MAAOua,EACPG,YAAY,EACZC,UAAU,EACVC,cAAc,IAGpB,gCCAApf,EAAOC,QATP,SAAsBof,EAAMC,GAC1B,OAAOD,EAAKzZ,QAAO,SAAUpB,EAAOpB,GAClC,OACEkc,EAAKrZ,QAAQzB,IAAU,GACvB6a,EAAKpZ,QAAQzB,KAAWpB,CAE5B,GACF,kCCAA,SAASmc,EAA0B/a,GACjC,MACmB,oBAAVA,GACPjD,MAAMoF,QAAQnC,IAC4B,oBAA1Cc,OAAOpF,UAAUqQ,SAASjP,KAAKkD,EAEnC,CAEA,SAASgb,EAAOC,EAAQnB,GACtB,GAAImB,IAAWnB,EACb,OAAOmB,EAIT,IAAK,IAAI9c,KAAO2b,EACd,GACGhZ,OAAOpF,UAAUwf,eAAepe,KAAKgd,EAAQ3b,IACtC,cAARA,GACQ,gBAARA,EAHF,CASA,IAAIgd,EAAYrB,EAAO3b,GACnBid,EAAYH,EAAO9c,GAEE,qBAAdid,GAAkD,qBAAdD,IAM7CJ,EAA0BK,IAC1BL,EAA0BI,GAE1BF,EAAO9c,GAAO6c,EAAOI,EAAWD,GAEhCF,EAAO9c,GA5CU,kBADR6B,EA6CWmb,IA5CmB,OAAVnb,EACxBgb,EAAOje,MAAMoF,QAAQnC,GAAS,GAAK,CAAC,EAAGA,GAEzCA,EAyBL,CA7BJ,IAAeA,EAgDb,OAAOib,CACT,CAgCAzf,EAAOC,QAfP,SAAewf,GACRF,EAA0BE,KAC7BA,EAAS,CAAC,GAGZ,IAAK,IAAI3e,EAAI,EAAG+e,EAAI3e,UAAUD,OAAQH,EAAI+e,EAAG/e,IAAK,CAChD,IAAIwd,EAASpd,UAAUJ,GAEnBye,EAA0BjB,IAC5BkB,EAAOC,EAAQnB,EAEnB,CACA,OAAOmB,CACT,kCC3EAzf,EAAOC,QAJP,SAAuB6f,GACrB,OAAOA,GAAOxa,OAAOC,KAAKua,GAAK7e,OAAS,CAC1C,kCCcAjB,EAAOC,QAfP,SAAuCqe,EAAQyB,GAC7C,GAAe,OAAXzB,EAAiB,MAAO,CAAC,EAC7B,IAEI3b,EACA7B,EAHA2e,EAAS,CAAC,EACVO,EAAa1a,OAAOC,KAAK+Y,GAG7B,IAAKxd,EAAI,EAAGA,EAAIkf,EAAW/e,OAAQH,IACjC6B,EAAMqd,EAAWlf,GAEbif,EAAS9Z,QAAQtD,IAAQ,IAC7B8c,EAAO9c,GAAO2b,EAAO3b,IAEvB,OAAO8c,CACT,kCCdA,SAASQ,EAAiBzb,EAAO0b,GAC/B,GAAI1b,IAAU0b,EAAO,CACnB,IAAIC,OAAyBxgB,IAAV6E,EACf4b,EAAsB,OAAV5b,EAEZ6b,OAAyB1gB,IAAVugB,EACfI,EAAsB,OAAVJ,EAEhB,IACII,GAAa9b,EAAQ0b,GACtBE,GAAaC,IACbF,EAED,OAAO,EAET,IACIC,GAAa5b,EAAQ0b,GACtBI,GAAaH,IACbE,EAED,OAAQ,CAEZ,CACA,OAAO,CACT,CAqDArgB,EAAOC,QA7CP,SAAiBsgB,EAAYC,EAAWC,GACtC,IAAKlf,MAAMoF,QAAQ4Z,GACjB,MAAO,GAGJhf,MAAMoF,QAAQ8Z,KACjBA,EAAS,IAGX,IAAI7M,EAAS2M,EAAW/X,KAAI,SAAUhE,EAAOpB,GAC3C,MAAO,CACLsd,SAAUF,EAAUhY,KAAI,SAAUmY,GAChC,OAAOnc,EAAMmc,EACf,IACAvd,MAAOA,EACPoB,MAAOA,EAEX,IAuBA,OArBAoP,EAAOhF,MAAK,SAAkBgS,EAAQV,GAGpC,IAFA,IAAI9c,GAAS,IAEJA,EAAQwd,EAAOF,SAASzf,QAAQ,CACvC,IAAI0W,EAAMsI,EAAiBW,EAAOF,SAAStd,GAAQ8c,EAAMQ,SAAStd,IAClE,GAAIuU,EACF,OAAIvU,GAASqd,EAAOxf,OACX0W,EAEa,SAAlB8I,EAAOrd,IACDuU,EAEHA,CAEX,CAIA,OAAOiJ,EAAOxd,MAAQ8c,EAAM9c,KAC9B,IAEOwQ,EAAOpL,KAAI,SAAUmP,GAC1B,OAAOA,EAAInT,KACb,GACF,kCC7DAxE,EAAOC,QAdP,SAASoG,EAAYrB,GACnB,GAAiB,kBAANA,EACT,OAAOA,EACF,GAAiB,kBAANA,EAChB,OAAOsD,WAAWtD,GACb,GAAIzD,MAAMoF,QAAQ3B,GACvB,OAAOA,EAAEwD,IAAInC,GAGf,MAAM,IAAIlF,MACR,wEAEJ,sCCZA,IAAIiF,EAAQ,EAAQ,OAEpB,SAASya,EAAWf,GAClB,OAAOxa,OAAOC,KAAKua,GAChBlR,OACApJ,QAAO,SAAU8J,EAAKwR,GAErB,OADAxR,EAAIwR,GAAQhB,EAAIgB,GACTxR,CACT,GAAG,CAAC,EACR,CAEA,IAAI2I,EAAiB,CASnBqB,YAAa,SAAoBlW,EAAOsN,GACtC,IAAI2I,EAAU,GAoGd,OAjGAA,EAAQvX,KAAK,CACXiZ,UAAW3X,EACX2D,OAAQkR,EAAegB,qBAAqBvI,KAI9CA,EAAMjC,8BAA8B5G,SAAQ,SAAUkN,GACpDsE,EAAQvX,KAAK,CACXiZ,UAAW3X,EACX2D,OAAQkR,EAAe8I,iCACrBrQ,EACAqE,IAGN,IAGArE,EAAM/B,+BAA+B9G,SAAQ,SAAUkN,GACrD,IAAI7I,EAAoBwE,EAAMjD,2BAA2BsH,GACrD7L,EAAoBwH,EAAMvH,0BAA0B4L,GACpDxH,EAAYmD,EAAMlD,+BAA+BtB,GAIrD,GACEhD,EAAkBjI,OAAS,GAC3BiI,EAAkB,GAAGkH,MAAM7C,GAAWtM,OAAS,EAC/C,CAEA,IAAI+f,EAAa9X,EAAkB,GAChCkH,MAAM7C,GACN/L,MAAM,GAAI,GACVgE,QAAO,SAA0BgD,EAAKyY,EAASxP,GAC9C,OAAOjJ,EAAI5D,OAAO,CAChBL,UAAW2H,EAAkB8G,WAAWvB,GACxCjN,MACY,IAAViN,EACIwP,EACA,CAACzY,EAAIA,EAAIvH,OAAS,GAAGuD,MAAOyc,GAASC,KAAK3T,IAEpD,GAAG,IAELyT,EAAWnZ,SAAQ,SAAUjC,EAAQ6L,GACnC,IAAI1K,EAASkR,EAAe8I,iCAC1BrQ,EACA9K,EAAOrB,UACG,IAAVkN,GAIF,SAAS0P,EAA2B3c,GAClC,OAAO0H,EAAkB8G,WAAWoO,MAAK,SAAU7c,GACjD,OAAOA,IAAcC,EAAM4L,MAAM,KAAK,EACxC,GACF,CAEA,IAAIiR,GAAwBta,EAAO4W,cAAgB,IAAInY,QACrD,SAAU8J,EAAKgS,GACb,GAAI/f,MAAMoF,QAAQ2a,GAAc,CAC9B,IAAIC,EAAWD,EAAY1b,QAAO,SAAU4b,GAC1C,OAAQL,EAA2BK,EACrC,IAEID,EAAStgB,OAAS,GACpBqO,EAAIxN,KAAKyf,EAEb,CASA,MANyB,kBAAhBD,GACNH,EAA2BG,IAE5BhS,EAAIxN,KAAKwf,GAGJhS,CACT,GACA,IAGEkC,EAASwP,EAAWvP,EAAQ,GAE9B1K,EAAO4W,aADLlM,EAAQ,EACY4P,EAAqBzc,OACzC4M,EAAOjN,UAAY,IAAMiN,EAAOhN,OAIhC6c,EAAqBpgB,OAAS,EAC1BogB,OACA1hB,EAGR0Z,EAAQvX,KAAK,CAAEiZ,UAAW3X,EAAO2D,OAAQA,GAC3C,GACF,CACF,IAEOsS,CACT,EAQAJ,qBAAsB,SAAUvI,GAC9B,IAAIvJ,EAASuJ,EAAMvJ,OAChBvC,OAAO8L,EAAMtJ,mBACbxC,OAAOqT,EAAewJ,qCAAqC/Q,IAC3D9B,OAEC+O,EAAe1F,EAAeyJ,iBAAiBhR,GAC/ChH,EAAiBuO,EAAe0J,mBAAmBjR,GACnDjH,EAAawO,EAAe2J,eAAelR,GAC3CmR,EAAmB,CACrB1a,OAAQA,EAAOlB,QAAQ,MAAQ,EAAI,CAAC,KAAOkB,EAC3CsC,WAAYA,GAWd,OARIkU,EAAa1c,OAAS,IACxB4gB,EAAiBlE,aAAeA,GAG9BjU,EAAezI,OAAS,IAC1B4gB,EAAiBnY,eAAiBA,GAG7BmX,EAAWza,EAAM,CAAC,EAAGsK,EAAM1B,iBAAkB6S,GACtD,EAUAd,iCAAkC,SAChCrQ,EACA1H,EACA8Y,GAEA,IAAInE,EAAe1F,EAAeyJ,iBAChChR,EACA1H,EACA8Y,GAEEpY,EAAiBuO,EAAe0J,mBAAmBjR,EAAO1H,GAC1DS,EAAawO,EAAe2J,eAAelR,GAC3CmR,EAAmB,CACrBnX,YAAa,EACbJ,KAAM,EACNyX,WAAW,EACXC,gBAAgB,GAGdvY,EAAWxI,OAAS,IACtB4gB,EAAiBpY,WAAaA,GAGhC,IAAIyC,EAAoBwE,EAAMjD,2BAA2BzE,GAqBzD,OAlBE6Y,EAAiB1a,OADf+E,EAEA+L,EAAegK,0CACbvR,EACAxE,EACA4V,GAGsB9Y,EAGxBU,EAAezI,OAAS,IAC1B4gB,EAAiBnY,eAAiBA,GAGhCiU,EAAa1c,OAAS,IACxB4gB,EAAiBlE,aAAeA,GAG3BkD,EAAWza,EAAM,CAAC,EAAGsK,EAAM1B,iBAAkB6S,GACtD,EASAF,mBAAoB,SAAUjR,EAAOzF,GACnC,GAAIyF,EAAMhH,eACR,OAAOgH,EAAMhH,eAGf,IAAIA,EAAiB,GAqBrB,OAnBApE,OAAOC,KAAKmL,EAAMjJ,oBAAoBI,SAAQ,SAAUtD,GACtD,IAAImE,EAAYgI,EAAMjJ,mBAAmBlD,IAAc,CAAC,EACxDe,OAAOC,KAAKmD,GAAWb,SAAQ,SAAUc,GACvC,IAAIjD,EAASgD,EAAUC,IAAa,GAChCsC,IAAc1G,GAChBmB,EAAOmC,SAAQ,SAAUrD,GACvB,GAAIjD,MAAMoF,QAAQnC,GAAQ,CACxB,IAAI0d,EAAK1d,EAAMgE,KAAI,SAAUxD,GAC3B,OAAOT,EAAYoE,EAAW3D,CAChC,IACA0E,EAAe5H,KAAKogB,EACtB,MACExY,EAAe5H,KAAKyC,EAAYoE,EAAWnE,EAE/C,GAEJ,GACF,IAEOkF,CACT,EAQAkY,eAAgB,SAAUlR,GACxB,OAAIA,EAAMjH,WACDiH,EAAMjH,WAGRiH,EAAMhJ,eAAewZ,KAAK,IACnC,EAWAQ,iBAAkB,SAAUhR,EAAO1H,EAAO8Y,GACxC,IAAInE,EAAe,GAEfrW,EAAoBoJ,EAAMpJ,mBAAqB,CAAC,EACpDhC,OAAOC,KAAK+B,GACTsH,OACA/G,SAAQ,SAAUoD,IACC3D,EAAkB2D,IAAc,IACtC2D,OAAO/G,SAAQ,SAAUgK,GACnC8L,EAAa7b,KAAKmJ,EAAY,IAAM4G,EACtC,GACF,IAEF,IAAItK,EAAiBmJ,EAAMnJ,gBAAkB,CAAC,EAC9CjC,OAAOC,KAAKgC,GACTqH,OACA/G,SAAQ,SAAUoD,IACC1D,EAAe0D,IAAc,IACnC2D,OAAO/G,SAAQ,SAAUgK,GACnC8L,EAAa7b,KAAKmJ,EAAY,KAAO4G,EACvC,GACF,IAEF,IAAIrK,EAA+BkJ,EAAMlJ,8BAAgC,CAAC,EAC1ElC,OAAOC,KAAKiC,GACToH,OACA/G,SAAQ,SAAUoD,GACjB,IAAI4L,EAAcrP,EAA6ByD,IAAc,GAC7D,GAAIA,IAAcjC,GAAU6N,GAAsC,IAAvBA,EAAY5V,OAAvD,CAGA,IAAIkhB,EAAY,GAEhBtL,EAAYjI,OAAO/G,SAAQ,SAAUgK,GACnCsQ,EAAUrgB,KAAKmJ,EAAY,IAAM4G,EACnC,IAEA8L,EAAa7b,KAAKqgB,EAPlB,CAQF,IAEF,IAAIxa,EACF+I,EAAM/I,+BAAiC,CAAC,EAmD1C,OAlDArC,OAAOC,KAAKoC,GACTiH,OACA/G,SAAQ,SAAUoD,GACjB,IACI4G,GADclK,EAA8BsD,IAAc,IACjC,GAE7B,QAAmBtL,IAAfkS,EAAJ,CAIA,IAGIuQ,EACAC,EAJAnW,EAAoBwE,EAAMjD,2BAA2BxC,GACrDsC,EAAYmD,EAAMlD,+BAA+BtB,GACjDjD,EAAWyH,EAAMZ,yBAAyB5D,GAK9C,GAAIlD,IAAUiC,EAAW,CAGvB,IACqC,IAAnC4G,EAAW5L,QAAQsH,KACjBtE,IAAsC,IAA1B6Y,GACb7Y,GACCA,EAASmH,MAAM7C,GAAWtM,SACxB4Q,EAAWzB,MAAM7C,GAAWtM,OAEhC,OAGGgI,GAIHoZ,EAAkBpZ,EAASmH,MAAM7C,GAAWtM,OAAS,EACrD4Q,EAAa5I,IAJboZ,EAAkBxQ,EAAWzB,MAAM7C,GAAWtM,OAAS,EACvD4Q,EAAaA,EAAWrQ,MAAM,EAAGqQ,EAAWnE,YAAYH,KAM1D6U,EAAoBlW,EAAkB8G,WAAWqP,EACnD,MACEA,EAAkBxQ,EAAWzB,MAAM7C,GAAWtM,OAAS,EAEvDmhB,EAAoBlW,EAAkB8G,WAAWqP,GAG/CD,GACFzE,EAAa7b,KAAK,CAACsgB,EAAoB,IAAMvQ,GAtC/C,CAwCF,IAEK8L,CACT,EAEA8D,qCAAsC,SAAU/Q,GAG9C,OAAOA,EAAMrJ,mBAAmB7B,QAE9B,SACE8c,EACApW,GAEA,IAAIqW,EAAyB7R,EAAMvH,0BACjC+C,EAAkB9C,MAClB,GAGF,IAAKmZ,EAEH,OADAD,EAAcxgB,KAAKoK,EAAkB8G,WAAW,IACzCsP,EAGT,IAAI/U,EAAYmD,EAAMlD,+BAA+BtB,GACjDuF,EAAQ8Q,EAAuBnS,MAAM7C,GAAWtM,OAChDuhB,EAAgBtW,EAAkB8G,WAAWxR,MAAM,EAAGiQ,EAAQ,GAElE,OAAO6Q,EAAc1d,OAAO4d,EAC9B,GAvBQ,GA0BZ,EAEAP,0CAA2C,SACzCvR,EACAxE,EACAuW,GAEA,IAAIlV,EAAYmD,EAAMlD,+BAA+BtB,GACrD,IAAkB,IAAduW,EAAoB,CACtB,IAAIxZ,EAAWyH,EAAMZ,yBAAyB5D,GAC1C2I,EAAiB,EAKrB,OAHI5L,IACF4L,EAAiB5L,EAASmH,MAAM7C,GAAWtM,QAEtC,CAACiL,EAAkB8G,WAAW6B,GACvC,CAEA,IAKI6N,GAJFhS,EAAMvH,0BAA0B+C,EAAkB9C,MAAM,IAAM,IAIvBgH,MAAM7C,GAAWtM,OAAS,EACnE,OAAOiL,EAAkB8G,WAAWxR,MAAM,EAAGkhB,EAAc,EAC7D,EAEA7H,uBAAwB,SAAU5P,EAAWd,EAAOoQ,EAAc7J,GAChE,IAAIiS,EAA+BjS,EAAMtF,mBAAmBH,GACxDyF,EAAMrH,iBAAiB4B,GACvByF,EACAkS,EAAiC,CACnCC,WAAY1Y,EACZc,UAAWA,GAKb,MAH4B,kBAAjBsP,IACTqI,EAA+BrI,aAAeA,GAEzCsG,EACLza,EACE,CAAC,EACD6R,EAAegB,qBAAqB0J,GACpCC,GAGN,GAGF5iB,EAAOC,QAAUgY,kCCvbjBjY,EAAOC,QAAU,SAA0BgH,GACzC,OAAkB,OAAdA,GAGG,wBAAwB6b,KAAK7b,EACtC,kCCLAjH,EAAOC,QAAU,yCCAjB,IAAIuV,EAAU+I,OAAOre,UAAUsV,QAC3BuN,EAAkB,OAElBC,EACS,UADTA,EAES,UAGbhjB,EAAOC,QAAU,CACb,QAAW+iB,EACXC,WAAY,CACRC,QAAS,SAAU1e,GACf,OAAOgR,EAAQlU,KAAKkD,EAAOue,EAAiB,IAChD,EACAI,QAAS,SAAU3e,GACf,OAAO+Z,OAAO/Z,EAClB,GAEJ0e,QAASF,EACTG,QAASH,uCCnBb,IAAIvS,EAAY,EAAQ,OACpB2S,EAAQ,EAAQ,OAChBC,EAAU,EAAQ,OAEtBrjB,EAAOC,QAAU,CACbojB,QAASA,EACTD,MAAOA,EACP3S,UAAWA,uCCPf,IAAI6S,EAAQ,EAAQ,OAEhBC,EAAMje,OAAOpF,UAAUwf,eACvB/Y,EAAUpF,MAAMoF,QAEhB8X,EAAW,CACX+E,WAAW,EACXC,iBAAiB,EACjBC,WAAY,GACZC,QAAS,QACTC,iBAAiB,EACjBC,OAAO,EACPC,QAASR,EAAMS,OACfC,UAAW,IACXnO,MAAO,EACPoO,mBAAmB,EACnBC,0BAA0B,EAC1BC,eAAgB,IAChBC,aAAa,EACbC,cAAc,EACdC,oBAAoB,GAGpBJ,EAA2B,SAAUK,GACrC,OAAOA,EAAI/O,QAAQ,aAAa,SAAUgP,EAAIC,GAC1C,OAAOlG,OAAOmG,aAAaC,SAASF,EAAW,IACnD,GACJ,EAEIG,EAAkB,SAAU9Z,EAAKyI,GACjC,OAAIzI,GAAsB,kBAARA,GAAoByI,EAAQsQ,OAAS/Y,EAAI7E,QAAQ,MAAQ,EAChE6E,EAAIsF,MAAM,KAGdtF,CACX,EA+GI+Z,EAAY,SAA8BC,EAAUha,EAAKyI,EAASwR,GAClE,GAAKD,EAAL,CAKA,IAAIniB,EAAM4Q,EAAQiQ,UAAYsB,EAAStP,QAAQ,cAAe,QAAUsP,EAKpEhP,EAAQ,gBAIRmL,EAAU1N,EAAQsC,MAAQ,GALf,eAK6BmP,KAAKriB,GAC7C6O,EAASyP,EAAUte,EAAInB,MAAM,EAAGyf,EAAQ7d,OAAST,EAIjD4C,EAAO,GACX,GAAIiM,EAAQ,CAER,IAAK+B,EAAQ8Q,cAAgBd,EAAIjiB,KAAKgE,OAAOpF,UAAWsR,KAC/C+B,EAAQkQ,gBACT,OAIRle,EAAKzD,KAAK0P,EACd,CAKA,IADA,IAAI1Q,EAAI,EACDyS,EAAQsC,MAAQ,GAAqC,QAA/BoL,EAAUnL,EAAMkP,KAAKriB,KAAkB7B,EAAIyS,EAAQsC,OAAO,CAEnF,GADA/U,GAAK,GACAyS,EAAQ8Q,cAAgBd,EAAIjiB,KAAKgE,OAAOpF,UAAW+gB,EAAQ,GAAGzf,MAAM,GAAI,MACpE+R,EAAQkQ,gBACT,OAGRle,EAAKzD,KAAKmf,EAAQ,GACtB,CAQA,OAJIA,GACA1b,EAAKzD,KAAK,IAAMa,EAAInB,MAAMyf,EAAQ7d,OAAS,KAnFjC,SAAU6hB,EAAOna,EAAKyI,EAASwR,GAG7C,IAFA,IAAIG,EAAOH,EAAeja,EAAM8Z,EAAgB9Z,EAAKyI,GAE5CzS,EAAImkB,EAAMhkB,OAAS,EAAGH,GAAK,IAAKA,EAAG,CACxC,IAAIgf,EACA7K,EAAOgQ,EAAMnkB,GAEjB,GAAa,OAATmU,GAAiB1B,EAAQ6Q,YACzBtE,EAAM,GAAGlb,OAAOsgB,OACb,CACHpF,EAAMvM,EAAQ8Q,aAAe/e,OAAO2Z,OAAO,MAAQ,CAAC,EACpD,IAAIkG,EAA+B,MAAnBlQ,EAAKmQ,OAAO,IAA+C,MAAjCnQ,EAAKmQ,OAAOnQ,EAAKhU,OAAS,GAAagU,EAAKzT,MAAM,GAAI,GAAKyT,EACjG7R,EAAQuhB,SAASQ,EAAW,IAC3B5R,EAAQ6Q,aAA6B,KAAde,GAGvB7kB,MAAM8C,IACJ6R,IAASkQ,GACT5G,OAAOnb,KAAW+hB,GAClB/hB,GAAS,GACRmQ,EAAQ6Q,aAAehhB,GAASmQ,EAAQmQ,YAE5C5D,EAAM,IACF1c,GAAS8hB,EACQ,cAAdC,IACPrF,EAAIqF,GAAaD,GAXjBpF,EAAM,CAAE,EAAGoF,EAanB,CAEAA,EAAOpF,CACX,CAEA,OAAOoF,CACX,CAqDWG,CAAY9f,EAAMuF,EAAKyI,EAASwR,EAhDvC,CAiDJ,EAoCA/kB,EAAOC,QAAU,SAAUskB,EAAKlhB,GAC5B,IAAIkQ,EAnCoB,SAA+BlQ,GACvD,IAAKA,EACD,OAAOob,EAGX,GAAqB,OAAjBpb,EAAKygB,cAAqCnkB,IAAjB0D,EAAKygB,SAAiD,oBAAjBzgB,EAAKygB,QACnE,MAAM,IAAIvjB,UAAU,iCAGxB,GAA4B,qBAAjB8C,EAAKsgB,SAA4C,UAAjBtgB,EAAKsgB,SAAwC,eAAjBtgB,EAAKsgB,QACxE,MAAM,IAAIpjB,UAAU,qEAExB,IAAIojB,EAAkC,qBAAjBtgB,EAAKsgB,QAA0BlF,EAASkF,QAAUtgB,EAAKsgB,QAE5E,MAAO,CACHH,UAAqC,qBAAnBngB,EAAKmgB,UAA4B/E,EAAS+E,YAAcngB,EAAKmgB,UAC/EC,gBAAiD,mBAAzBpgB,EAAKogB,gBAAgCpgB,EAAKogB,gBAAkBhF,EAASgF,gBAC7FC,WAAuC,kBAApBrgB,EAAKqgB,WAA0BrgB,EAAKqgB,WAAajF,EAASiF,WAC7EC,QAASA,EACTC,gBAAiD,mBAAzBvgB,EAAKugB,gBAAgCvgB,EAAKugB,gBAAkBnF,EAASmF,gBAC7FC,MAA6B,mBAAfxgB,EAAKwgB,MAAsBxgB,EAAKwgB,MAAQpF,EAASoF,MAC/DC,QAAiC,oBAAjBzgB,EAAKygB,QAAyBzgB,EAAKygB,QAAUrF,EAASqF,QACtEE,UAAqC,kBAAnB3gB,EAAK2gB,WAA0BV,EAAMgC,SAASjiB,EAAK2gB,WAAa3gB,EAAK2gB,UAAYvF,EAASuF,UAE5GnO,MAA8B,kBAAfxS,EAAKwS,QAAqC,IAAfxS,EAAKwS,OAAoBxS,EAAKwS,MAAQ4I,EAAS5I,MACzFoO,mBAA8C,IAA3B5gB,EAAK4gB,kBACxBC,yBAAmE,mBAAlC7gB,EAAK6gB,yBAAyC7gB,EAAK6gB,yBAA2BzF,EAASyF,yBACxHC,eAA+C,kBAAxB9gB,EAAK8gB,eAA8B9gB,EAAK8gB,eAAiB1F,EAAS0F,eACzFC,aAAkC,IAArB/gB,EAAK+gB,YAClBC,aAA2C,mBAAtBhhB,EAAKghB,aAA6BhhB,EAAKghB,aAAe5F,EAAS4F,aACpFC,mBAAuD,mBAA5BjhB,EAAKihB,mBAAmCjhB,EAAKihB,mBAAqB7F,EAAS6F,mBAE9G,CAGkBiB,CAAsBliB,GAEpC,GAAY,KAARkhB,GAAsB,OAARA,GAA+B,qBAARA,EACrC,OAAOhR,EAAQ8Q,aAAe/e,OAAO2Z,OAAO,MAAQ,CAAC,EASzD,IANA,IAAIuG,EAAyB,kBAARjB,EAlMP,SAAgCA,EAAKhR,GACnD,IAKIzS,EALAgf,EAAM,CAAC,EACP2F,EAAWlS,EAAQ0Q,kBAAoBM,EAAI/O,QAAQ,MAAO,IAAM+O,EAChEmB,EAAQnS,EAAQ4Q,iBAAmBwB,SAAWhmB,EAAY4T,EAAQ4Q,eAClEhS,EAAQsT,EAASrV,MAAMmD,EAAQyQ,UAAW0B,GAC1CE,GAAa,EAGbjC,EAAUpQ,EAAQoQ,QACtB,GAAIpQ,EAAQqQ,gBACR,IAAK9iB,EAAI,EAAGA,EAAIqR,EAAMlR,SAAUH,EACM,IAA9BqR,EAAMrR,GAAGmF,QAAQ,WAbX,mBAcFkM,EAAMrR,GACN6iB,EAAU,QAlBZ,wBAmBSxR,EAAMrR,KACb6iB,EAAU,cAEdiC,EAAY9kB,EACZA,EAAIqR,EAAMlR,QAKtB,IAAKH,EAAI,EAAGA,EAAIqR,EAAMlR,SAAUH,EAC5B,GAAIA,IAAM8kB,EAAV,CAGA,IAKIjjB,EAAKmI,EALLuF,EAAO8B,EAAMrR,GAEb+kB,EAAmBxV,EAAKpK,QAAQ,MAChCkY,GAA4B,IAAtB0H,EAA0BxV,EAAKpK,QAAQ,KAAO4f,EAAmB,GAG9D,IAAT1H,GACAxb,EAAM4Q,EAAQuQ,QAAQzT,EAAMoO,EAASqF,QAASH,EAAS,OACvD7Y,EAAMyI,EAAQ+Q,mBAAqB,KAAO,KAE1C3hB,EAAM4Q,EAAQuQ,QAAQzT,EAAK7O,MAAM,EAAG2c,GAAMM,EAASqF,QAASH,EAAS,OACrE7Y,EAAMwY,EAAMwC,SACRlB,EAAgBvU,EAAK7O,MAAM2c,EAAM,GAAI5K,IACrC,SAAUwS,GACN,OAAOxS,EAAQuQ,QAAQiC,EAAYtH,EAASqF,QAASH,EAAS,QAClE,KAIJ7Y,GAAOyI,EAAQ2Q,0BAAwC,eAAZP,IAC3C7Y,EAAMoZ,EAAyBpZ,IAG/BuF,EAAKpK,QAAQ,QAAU,IACvB6E,EAAMnE,EAAQmE,GAAO,CAACA,GAAOA,GAG7ByY,EAAIjiB,KAAKwe,EAAKnd,GACdmd,EAAInd,GAAO2gB,EAAM0C,QAAQlG,EAAInd,GAAMmI,GAEnCgV,EAAInd,GAAOmI,CA/Bf,CAmCJ,OAAOgV,CACX,CAoI4CmG,CAAY1B,EAAKhR,GAAWgR,EAChEzE,EAAMvM,EAAQ8Q,aAAe/e,OAAO2Z,OAAO,MAAQ,CAAC,EAIpD1Z,EAAOD,OAAOC,KAAKigB,GACd1kB,EAAI,EAAGA,EAAIyE,EAAKtE,SAAUH,EAAG,CAClC,IAAI6B,EAAM4C,EAAKzE,GACXolB,EAASrB,EAAUliB,EAAK6iB,EAAQ7iB,GAAM4Q,EAAwB,kBAARgR,GAC1DzE,EAAMwD,EAAMld,MAAM0Z,EAAKoG,EAAQ3S,EACnC,CAEA,OAAO+P,EAAM1Q,QAAQkN,EACzB,sCC9PA,IAAIwD,EAAQ,EAAQ,OAChBD,EAAU,EAAQ,OAClBE,EAAMje,OAAOpF,UAAUwf,eAEvByG,EAAwB,CACxBC,SAAU,SAAkBC,GACxB,OAAOA,EAAS,IACpB,EACAxC,MAAO,QACP5Q,QAAS,SAAiBoT,EAAQ1jB,GAC9B,OAAO0jB,EAAS,IAAM1jB,EAAM,GAChC,EACA2jB,OAAQ,SAAgBD,GACpB,OAAOA,CACX,GAGA1f,EAAUpF,MAAMoF,QAChByJ,EAAQmO,OAAOre,UAAUkQ,MACzBtO,EAAOP,MAAMrB,UAAU4B,KACvBykB,EAAc,SAAUC,EAAKC,GAC7B3kB,EAAKL,MAAM+kB,EAAK7f,EAAQ8f,GAAgBA,EAAe,CAACA,GAC5D,EAEIC,EAAQC,KAAKzmB,UAAU0mB,YAEvBC,EAAgBxD,EAAiB,QACjC5E,EAAW,CACXqI,gBAAgB,EAChBtD,WAAW,EACXG,QAAS,QACTC,iBAAiB,EACjBI,UAAW,IACX+C,QAAQ,EACRC,QAAS1D,EAAMyD,OACfE,kBAAkB,EAClB1U,OAAQsU,EACRK,UAAW7D,EAAQJ,WAAW4D,GAE9B5T,SAAS,EACTkU,cAAe,SAAuBC,GAClC,OAAOV,EAAMplB,KAAK8lB,EACtB,EACAC,WAAW,EACX/C,oBAAoB,GAWpB7T,EAAY,SAASA,EACrBmQ,EACAyF,EACAiB,EACAhD,EACA+C,EACAL,EACAphB,EACAgJ,EACA4U,EACA2D,EACA5U,EACA2U,EACAD,EACAtD,GAEA,IAxBuD3e,EAwBnD8a,EAAMc,EAcV,GAbsB,oBAAXhb,EACPka,EAAMla,EAAOygB,EAAQvG,GACdA,aAAe6G,KACtB7G,EAAMqH,EAAcrH,GACW,UAAxBwH,GAAmC3gB,EAAQmZ,KAClDA,EAAMwD,EAAMwC,SAAShG,GAAK,SAAUtb,GAChC,OAAIA,aAAiBmiB,KACVQ,EAAc3iB,GAElBA,CACX,KAGQ,OAARsb,EAAc,CACd,GAAIwE,EACA,OAAO0C,IAAYC,EAAmBD,EAAQX,EAAQ5H,EAASuI,QAASrD,EAAS,MAAOpR,GAAU8T,EAGtGvG,EAAM,EACV,CAEA,GA7CoB,kBADmC9a,EA8C7B8a,IA5CN,kBAAN9a,GACM,mBAANA,GACM,kBAANA,GACM,kBAANA,GAyCoBse,EAAMiE,SAASzH,GAAM,CACnD,GAAIkH,EAAS,CACT,IAAIQ,EAAWP,EAAmBZ,EAASW,EAAQX,EAAQ5H,EAASuI,QAASrD,EAAS,MAAOpR,GAC7F,GAA4B,UAAxB+U,GAAmCL,EAAkB,CAGrD,IAFA,IAAIQ,EAAcrX,EAAM9O,KAAKid,OAAOuB,GAAM,KACtC4H,EAAe,GACV5mB,EAAI,EAAGA,EAAI2mB,EAAYxmB,SAAUH,EACtC4mB,IAAuB,IAAN5mB,EAAU,GAAK,KAAOomB,EAAUF,EAAQS,EAAY3mB,GAAI2d,EAASuI,QAASrD,EAAS,QAASpR,IAEjH,MAAO,CAAC2U,EAAUM,GAAY,IAAME,EACxC,CACA,MAAO,CAACR,EAAUM,GAAY,IAAMN,EAAUF,EAAQlH,EAAKrB,EAASuI,QAASrD,EAAS,QAASpR,IACnG,CACA,MAAO,CAAC2U,EAAUb,GAAU,IAAMa,EAAU3I,OAAOuB,IACvD,CAEA,IAMI6H,EANAjiB,EAAS,GAEb,GAAmB,qBAARoa,EACP,OAAOpa,EAIX,GAA4B,UAAxB4hB,GAAmC3gB,EAAQmZ,GAE3C6H,EAAU,CAAC,CAAEnjB,MAAOsb,EAAI7e,OAAS,EAAI6e,EAAIoB,KAAK,MAAQ,UAAO,SAC1D,GAAIva,EAAQf,GACf+hB,EAAU/hB,MACP,CACH,IAAIL,EAAOD,OAAOC,KAAKua,GACvB6H,EAAU/Y,EAAOrJ,EAAKqJ,KAAKA,GAAQrJ,CACvC,CAEA,IAAK,IAAIqiB,EAAI,EAAGA,EAAID,EAAQ1mB,SAAU2mB,EAAG,CACrC,IAAIjlB,EAAMglB,EAAQC,GACdpjB,EAAuB,kBAAR7B,GAAyC,qBAAdA,EAAI6B,MAAwB7B,EAAI6B,MAAQsb,EAAInd,GAE1F,IAAI0kB,GAAuB,OAAV7iB,EAAjB,CAIA,IAAIqjB,EAAYlhB,EAAQmZ,GACa,oBAAxBwH,EAAqCA,EAAoBjB,EAAQ1jB,GAAO0jB,EAC/EA,GAAU7C,EAAY,IAAM7gB,EAAM,IAAMA,EAAM,KAEpD4jB,EAAY7gB,EAAQ+K,EAChBjM,EACAqjB,EACAP,EACAhD,EACA+C,EACAL,EACAphB,EACAgJ,EACA4U,EACA2D,EACA5U,EACA2U,EACAD,EACAtD,GApBJ,CAsBJ,CAEA,OAAOje,CACX,EAiDA1F,EAAOC,QAAU,SAAU2gB,EAAQvd,GAC/B,IAGIskB,EAHA7H,EAAMc,EACNrN,EAjDwB,SAAmClQ,GAC/D,IAAKA,EACD,OAAOob,EAGX,GAAqB,OAAjBpb,EAAK2jB,SAA4C,qBAAjB3jB,EAAK2jB,SAAmD,oBAAjB3jB,EAAK2jB,QAC5E,MAAM,IAAIzmB,UAAU,iCAGxB,IAAIojB,EAAUtgB,EAAKsgB,SAAWlF,EAASkF,QACvC,GAA4B,qBAAjBtgB,EAAKsgB,SAA4C,UAAjBtgB,EAAKsgB,SAAwC,eAAjBtgB,EAAKsgB,QACxE,MAAM,IAAIpjB,UAAU,qEAGxB,IAAIgS,EAAS8Q,EAAiB,QAC9B,GAA2B,qBAAhBhgB,EAAKkP,OAAwB,CACpC,IAAKgR,EAAIjiB,KAAK+hB,EAAQJ,WAAY5f,EAAKkP,QACnC,MAAM,IAAIhS,UAAU,mCAExBgS,EAASlP,EAAKkP,MAClB,CACA,IAAI2U,EAAY7D,EAAQJ,WAAW1Q,GAE/B3M,EAAS6Y,EAAS7Y,OAKtB,OAJ2B,oBAAhBvC,EAAKuC,QAAyBe,EAAQtD,EAAKuC,WAClDA,EAASvC,EAAKuC,QAGX,CACHkhB,eAA+C,mBAAxBzjB,EAAKyjB,eAA+BzjB,EAAKyjB,eAAiBrI,EAASqI,eAC1FtD,UAAqC,qBAAnBngB,EAAKmgB,UAA4B/E,EAAS+E,YAAcngB,EAAKmgB,UAC/EG,QAASA,EACTC,gBAAiD,mBAAzBvgB,EAAKugB,gBAAgCvgB,EAAKugB,gBAAkBnF,EAASmF,gBAC7FI,UAAqC,qBAAnB3gB,EAAK2gB,UAA4BvF,EAASuF,UAAY3gB,EAAK2gB,UAC7E+C,OAA+B,mBAAhB1jB,EAAK0jB,OAAuB1jB,EAAK0jB,OAAStI,EAASsI,OAClEC,QAAiC,oBAAjB3jB,EAAK2jB,QAAyB3jB,EAAK2jB,QAAUvI,EAASuI,QACtEC,iBAAmD,mBAA1B5jB,EAAK4jB,iBAAiC5jB,EAAK4jB,iBAAmBxI,EAASwI,iBAChGrhB,OAAQA,EACR2M,OAAQA,EACR2U,UAAWA,EACXC,cAA6C,oBAAvB9jB,EAAK8jB,cAA+B9jB,EAAK8jB,cAAgB1I,EAAS0I,cACxFE,UAAqC,mBAAnBhkB,EAAKgkB,UAA0BhkB,EAAKgkB,UAAY5I,EAAS4I,UAC3EzY,KAA2B,oBAAdvL,EAAKuL,KAAsBvL,EAAKuL,KAAO,KACpD0V,mBAAuD,mBAA5BjhB,EAAKihB,mBAAmCjhB,EAAKihB,mBAAqB7F,EAAS6F,mBAE9G,CAIkBwD,CAA0BzkB,GAKV,oBAAnBkQ,EAAQ3N,OAEfka,GADAla,EAAS2N,EAAQ3N,QACJ,GAAIka,GACVnZ,EAAQ4M,EAAQ3N,UAEvB+hB,EADSpU,EAAQ3N,QAIrB,IAMImiB,EANAxiB,EAAO,GAEX,GAAmB,kBAARua,GAA4B,OAARA,EAC3B,MAAO,GAKPiI,EADA1kB,GAAQA,EAAK0kB,eAAe5B,EACd9iB,EAAK0kB,YACZ1kB,GAAQ,YAAaA,EACdA,EAAK4P,QAAU,UAAY,SAE3B,UAGlB,IAAIqU,EAAsBnB,EAAsB4B,GAE3CJ,IACDA,EAAUriB,OAAOC,KAAKua,IAGtBvM,EAAQ3E,MACR+Y,EAAQ/Y,KAAK2E,EAAQ3E,MAGzB,IAAK,IAAI9N,EAAI,EAAGA,EAAI6mB,EAAQ1mB,SAAUH,EAAG,CACrC,IAAI6B,EAAMglB,EAAQ7mB,GAEdyS,EAAQ8T,WAA0B,OAAbvH,EAAInd,IAG7B4jB,EAAYhhB,EAAMkL,EACdqP,EAAInd,GACJA,EACA2kB,EACA/T,EAAQ+Q,mBACR/Q,EAAQ8T,UACR9T,EAAQwT,OAASxT,EAAQyT,QAAU,KACnCzT,EAAQ3N,OACR2N,EAAQ3E,KACR2E,EAAQiQ,UACRjQ,EAAQ4T,cACR5T,EAAQhB,OACRgB,EAAQ2T,UACR3T,EAAQ0T,iBACR1T,EAAQoQ,SAEhB,CAEA,IAAIqE,EAASziB,EAAK2b,KAAK3N,EAAQyQ,WAC3BqC,GAAoC,IAA3B9S,EAAQuT,eAA0B,IAAM,GAYrD,OAVIvT,EAAQqQ,kBACgB,eAApBrQ,EAAQoQ,QAER0C,GAAU,uBAGVA,GAAU,mBAIX2B,EAAO/mB,OAAS,EAAIolB,EAAS2B,EAAS,EACjD,sCC5RA,IAAI3E,EAAU,EAAQ,OAElBE,EAAMje,OAAOpF,UAAUwf,eACvB/Y,EAAUpF,MAAMoF,QAEhBshB,EAAY,WAEZ,IADA,IAAI5Z,EAAQ,GACHvN,EAAI,EAAGA,EAAI,MAAOA,EACvBuN,EAAMvM,KAAK,MAAQhB,EAAI,GAAK,IAAM,IAAMA,EAAEyP,SAAS,KAAK2X,eAG5D,OAAO7Z,CACX,CAPe,GA4BX8Z,EAAgB,SAAuB7J,EAAQ/K,GAE/C,IADA,IAAIuM,EAAMvM,GAAWA,EAAQ8Q,aAAe/e,OAAO2Z,OAAO,MAAQ,CAAC,EAC1Dne,EAAI,EAAGA,EAAIwd,EAAOrd,SAAUH,EACR,qBAAdwd,EAAOxd,KACdgf,EAAIhf,GAAKwd,EAAOxd,IAIxB,OAAOgf,CACX,EAoMA9f,EAAOC,QAAU,CACbkoB,cAAeA,EACfC,OA3IS,SAA4B3I,EAAQnB,GAC7C,OAAOhZ,OAAOC,KAAK+Y,GAAQ9Y,QAAO,SAAU8J,EAAK3M,GAE7C,OADA2M,EAAI3M,GAAO2b,EAAO3b,GACX2M,CACX,GAAGmQ,EACP,EAuIIuG,QAlBU,SAAiBvf,EAAGC,GAC9B,MAAO,GAAG9B,OAAO6B,EAAGC,EACxB,EAiBIkM,QAvDU,SAAiBpO,GAI3B,IAHA,IAAI6jB,EAAQ,CAAC,CAAEvI,IAAK,CAAEwI,EAAG9jB,GAAS+jB,KAAM,MACpCC,EAAO,GAEF1nB,EAAI,EAAGA,EAAIunB,EAAMpnB,SAAUH,EAKhC,IAJA,IAAI8U,EAAOyS,EAAMvnB,GACbgf,EAAMlK,EAAKkK,IAAIlK,EAAK2S,MAEpBhjB,EAAOD,OAAOC,KAAKua,GACd8H,EAAI,EAAGA,EAAIriB,EAAKtE,SAAU2mB,EAAG,CAClC,IAAIjlB,EAAM4C,EAAKqiB,GACX9c,EAAMgV,EAAInd,GACK,kBAARmI,GAA4B,OAARA,IAAuC,IAAvB0d,EAAKviB,QAAQ6E,KACxDud,EAAMvmB,KAAK,CAAEge,IAAKA,EAAKyI,KAAM5lB,IAC7B6lB,EAAK1mB,KAAKgJ,GAElB,CAKJ,OAlMe,SAAsBud,GACrC,KAAOA,EAAMpnB,OAAS,GAAG,CACrB,IAAI2U,EAAOyS,EAAMI,MACb3I,EAAMlK,EAAKkK,IAAIlK,EAAK2S,MAExB,GAAI5hB,EAAQmZ,GAAM,CAGd,IAFA,IAAI4I,EAAY,GAEPd,EAAI,EAAGA,EAAI9H,EAAI7e,SAAU2mB,EACR,qBAAX9H,EAAI8H,IACXc,EAAU5mB,KAAKge,EAAI8H,IAI3BhS,EAAKkK,IAAIlK,EAAK2S,MAAQG,CAC1B,CACJ,CACJ,CA+KIC,CAAaN,GAEN7jB,CACX,EAkCIuf,OAvIS,SAAUQ,EAAKT,EAASH,GACjC,IAAIiF,EAAiBrE,EAAI/O,QAAQ,MAAO,KACxC,GAAgB,eAAZmO,EAEA,OAAOiF,EAAepT,QAAQ,iBAAkBqT,UAGpD,IACI,OAAOC,mBAAmBF,EAC9B,CAAE,MAAOlP,GACL,OAAOkP,CACX,CACJ,EA4HI7B,OA1HS,SAAgBxC,EAAKwE,EAAgBpF,EAASqF,EAAMzW,GAG7D,GAAmB,IAAfgS,EAAItjB,OACJ,OAAOsjB,EAGX,IAAI0E,EAAS1E,EAOb,GANmB,kBAARA,EACP0E,EAASC,OAAOhpB,UAAUqQ,SAASjP,KAAKijB,GAClB,kBAARA,IACd0E,EAAS1K,OAAOgG,IAGJ,eAAZZ,EACA,OAAOwF,OAAOF,GAAQzT,QAAQ,mBAAmB,SAAUgP,GACvD,MAAO,SAAWG,SAASH,EAAGhjB,MAAM,GAAI,IAAM,KAClD,IAIJ,IADA,IAAImd,EAAM,GACD7d,EAAI,EAAGA,EAAImoB,EAAOhoB,SAAUH,EAAG,CACpC,IAAIsoB,EAAIH,EAAOI,WAAWvoB,GAGhB,KAANsoB,GACS,KAANA,GACM,KAANA,GACM,MAANA,GACCA,GAAK,IAAQA,GAAK,IAClBA,GAAK,IAAQA,GAAK,IAClBA,GAAK,IAAQA,GAAK,KAClB7W,IAAW8Q,EAAQH,UAAkB,KAANkG,GAAoB,KAANA,GAEjDzK,GAAOsK,EAAO7D,OAAOtkB,GAIrBsoB,EAAI,IACJzK,GAAYsJ,EAASmB,GAIrBA,EAAI,KACJzK,GAAasJ,EAAS,IAAQmB,GAAK,GAAMnB,EAAS,IAAY,GAAJmB,GAI1DA,EAAI,OAAUA,GAAK,MACnBzK,GAAasJ,EAAS,IAAQmB,GAAK,IAAOnB,EAAS,IAASmB,GAAK,EAAK,IAASnB,EAAS,IAAY,GAAJmB,IAIpGtoB,GAAK,EACLsoB,EAAI,QAAiB,KAAJA,IAAc,GAA8B,KAAvBH,EAAOI,WAAWvoB,IAExD6d,GAAOsJ,EAAS,IAAQmB,GAAK,IACvBnB,EAAS,IAASmB,GAAK,GAAM,IAC7BnB,EAAS,IAASmB,GAAK,EAAK,IAC5BnB,EAAS,IAAY,GAAJmB,GAC3B,CAEA,OAAOzK,CACX,EA4DI4I,SA9BW,SAAkBzH,GAC7B,SAAKA,GAAsB,kBAARA,OAITA,EAAInW,aAAemW,EAAInW,YAAY4d,UAAYzH,EAAInW,YAAY4d,SAASzH,GACtF,EAyBIwF,SAnCW,SAAkBxF,GAC7B,MAA+C,oBAAxCxa,OAAOpF,UAAUqQ,SAASjP,KAAKwe,EAC1C,EAkCIgG,SApBW,SAAkBhb,EAAKrH,GAClC,GAAIkD,EAAQmE,GAAM,CAEd,IADA,IAAIwe,EAAS,GACJxoB,EAAI,EAAGA,EAAIgK,EAAI7J,OAAQH,GAAK,EACjCwoB,EAAOxnB,KAAK2B,EAAGqH,EAAIhK,KAEvB,OAAOwoB,CACX,CACA,OAAO7lB,EAAGqH,EACd,EAYI1E,MA5MQ,SAASA,EAAMqZ,EAAQnB,EAAQ/K,GAEvC,IAAK+K,EACD,OAAOmB,EAGX,GAAsB,kBAAXnB,EAAqB,CAC5B,GAAI3X,EAAQ8Y,GACRA,EAAO3d,KAAKwc,OACT,KAAImB,GAA4B,kBAAXA,EAKxB,MAAO,CAACA,EAAQnB,IAJX/K,IAAYA,EAAQ8Q,cAAgB9Q,EAAQkQ,mBAAsBF,EAAIjiB,KAAKgE,OAAOpF,UAAWoe,MAC9FmB,EAAOnB,IAAU,EAIzB,CAEA,OAAOmB,CACX,CAEA,IAAKA,GAA4B,kBAAXA,EAClB,MAAO,CAACA,GAAQ7a,OAAO0Z,GAG3B,IAAIiL,EAAc9J,EAKlB,OAJI9Y,EAAQ8Y,KAAY9Y,EAAQ2X,KAC5BiL,EAAcpB,EAAc1I,EAAQlM,IAGpC5M,EAAQ8Y,IAAW9Y,EAAQ2X,IAC3BA,EAAOzW,SAAQ,SAAU+N,EAAM9U,GAC3B,GAAIyiB,EAAIjiB,KAAKme,EAAQ3e,GAAI,CACrB,IAAI0oB,EAAa/J,EAAO3e,GACpB0oB,GAAoC,kBAAfA,GAA2B5T,GAAwB,kBAATA,EAC/D6J,EAAO3e,GAAKsF,EAAMojB,EAAY5T,EAAMrC,GAEpCkM,EAAO3d,KAAK8T,EAEpB,MACI6J,EAAO3e,GAAK8U,CAEpB,IACO6J,GAGJna,OAAOC,KAAK+Y,GAAQ9Y,QAAO,SAAU8J,EAAK3M,GAC7C,IAAI6B,EAAQ8Z,EAAO3b,GAOnB,OALI4gB,EAAIjiB,KAAKgO,EAAK3M,GACd2M,EAAI3M,GAAOyD,EAAMkJ,EAAI3M,GAAM6B,EAAO+O,GAElCjE,EAAI3M,GAAO6B,EAER8K,CACX,GAAGia,EACP,uCCnGA,IAAIxmB,EAAsB,EAAQ,OAC9BC,EAAmB,EAAQ,OAC3BC,EAAgB,EAAQ,OAiC5B,SAASC,EAAoBC,EAAQC,EAAOC,GAC1C,OAAO,IAAIN,EAAoBI,EAAQC,EAAOC,EAChD,CAOAH,EAAoBI,QAAU,EAAQ,OAOtCJ,EAAoBH,oBAAsBA,EAO1CG,EAAoBF,iBAAmBA,EAOvCE,EAAoBD,cAAgBA,EAEpCjD,EAAOC,QAAUiD,sCCnEjB,IAAI3D,EAAe,EAAQ,OAgB3B,SAASgE,EAAcC,EAAYC,GACjCjE,KAAKkE,KAAOF,EACZhE,KAAKiE,GAAKA,EACVjE,KAAKmE,YAAc,IACrB,CAlBe,EAAQ,MAoBvBC,CAASL,EAAehE,GAOxBgE,EAAcrD,UAAU2D,OAAS,WAC/BrE,KAAKkD,qBACLlD,KAAKkE,KAAKI,oBAAoBtE,KAChC,EAEA+D,EAAcrD,UAAU6D,iBAAmB,SAAUC,GACnD,OAAOxE,KAAKiE,GAAGO,EACjB,EAEAhE,EAAOC,QAAUsD,sCC1BjB,IAAIU,EAAe,EAAQ,OACvBC,EAAgB,EAAQ,OACxBC,EAAO,EAAQ,OAEfC,EAAM,CAQRC,cAAe,SAAuBC,EAAgBC,EAAWC,GAC/D,GAAIJ,EAAIK,UAAUH,EAAgBC,EAAWC,GAC3C,OAAOF,EAGT,IAAII,EAAgB,GAAKF,EAErBG,EAAmBL,EAAeC,GAElCD,EAAeC,GAAWK,OAAOF,GADjC,CAACA,GAGDG,EAAM,CAAC,EAIX,OAFAA,EAAIN,GAAaI,EAEVV,EAAa,CAAC,EAAGY,EAAKP,EAC/B,EAUAQ,iBAAkB,SAChBR,EACAC,EACAC,GAEA,QAAc7E,IAAV6E,EAGF,OAAOJ,EAAIW,gBAAgBT,GAAgB,SAAUU,EAAGC,GACtD,OAAOV,IAAcU,CACvB,IAGF,IAAIP,EAAgB,GAAKF,EAEzB,OAAOJ,EAAIW,gBAAgBT,GAAgB,SAAUU,EAAGC,GACtD,OAAOV,IAAcU,GAAKP,IAAkBM,CAC9C,GACF,EAQAE,iBAAkB,SAChBZ,EACAC,EACAC,GAEA,QAAc7E,IAAV6E,EACF,MAAM,IAAIrD,MAAM,gDAElB,OAAIiD,EAAIK,UAAUH,EAAgBC,EAAWC,GACpCJ,EAAIU,iBAAiBR,EAAgBC,EAAWC,GAGlDJ,EAAIC,cAAcC,EAAgBC,EAAWC,EACtD,EAYAO,gBAAiB,SACfT,EACAC,EACAY,GAEA,QAAkBxF,IAAd4E,EAGF,OAAKL,EAAcI,GAGZ,CAAC,EAFCA,EAGJ,GAAyB,kBAAdC,EAChB,OAAOJ,EAAKG,EAAgB,CAACC,IACxB,GAAyB,oBAAdA,EAA0B,CAC1C,IAAIa,GAAa,EAEbC,EAAoBC,OAAOC,KAAKjB,GAAgBkB,QAAO,SACzDC,EACA9C,GAEA,IAAI+C,EAASpB,EAAe3B,IAAQ,GAChCgD,EAAYD,EAAOE,QAAO,SAAUpB,GACtC,OAAQD,EAAUC,EAAO7B,EAAKwC,EAChC,IAQA,OANIQ,EAAU1E,SAAWyE,EAAOzE,SAC9BmE,GAAa,GAGfK,EAAK9C,GAAOgD,EAELF,CACT,GACA,CAAC,GAED,OAAIL,EAAmBC,EAChBf,CACT,CAKF,EAUAG,UAAW,SAAmBH,EAAgBC,EAAWsB,GACvD,IAAIC,EACFC,QAAQzB,EAAeC,KACvBD,EAAeC,GAAWtD,OAAS,EAErC,QAAwBtB,IAApBkG,IAAkCC,EACpC,OAAOA,EAGT,IAAIE,EAA0B,GAAKH,EAEnC,OAAuE,IAAhEvB,EAAeC,GAAW0B,QAAQD,EAC3C,GAGFhG,EAAOC,QAAUmE,sCCzKjB,IAAIH,EAAe,EAAQ,OACvBiC,EAAO,EAAQ,OACfC,EAAe,EAAQ,MACvBC,EAAQ,EAAQ,MAChBlC,EAAgB,EAAQ,OACxBC,EAAO,EAAQ,OACfkC,EAAc,EAAQ,OACtBC,EAAmB,EAAQ,OAE3BC,EAAiB,EAAQ,OAY7B,SAASC,EAAyBC,EAAGC,GACnC,OAAInF,MAAMoF,QAAQF,IAAMlF,MAAMoF,QAAQD,GAElCD,EAAExF,SAAWyF,EAAEzF,QACfwF,EAAEG,OAAM,SAAUC,EAAI/F,GACpB,OAAO0F,EAAyBE,EAAE5F,GAAI+F,EACxC,IAGGJ,IAAMC,CACf,CA+DA,SAAS1D,EAAiB8D,GACxB,IAAIC,EAASD,EACT9D,EAAiBgE,cAAcF,GAC/B,CAAC,OAEoBnH,IAArBoH,EAAOE,WAA4BX,EAAiBS,EAAOE,YAE7DjF,QAAQkF,KACN,mIASJ1H,KAAK2H,OAASJ,EAAOI,QAAU,GAO/B3H,KAAK4H,kBAAoBL,EAAOK,mBAAqB,GASrD5H,KAAK6H,mBAAqBN,EAAOM,oBAAsB,GAevD7H,KAAK8H,kBAAoBP,EAAOO,mBAAqB,CAAC,EAatD9H,KAAK+H,eAAiBR,EAAOQ,gBAAkB,CAAC,EAahD/H,KAAKgI,6BAA+BT,EAAOS,8BAAgC,CAAC,EAY5EhI,KAAKiI,mBAAqBV,EAAOU,oBAAsB,CAAC,EAQxDjI,KAAKkI,eAAiBX,EAAOW,gBAAkB,GAe/ClI,KAAKmI,8BACHZ,EAAOY,+BAAiC,CAAC,EAG3C,IAAIC,EAAOpI,KACX8F,OAAOC,KAAKwB,GAAQc,SAAQ,SAAUC,GACpC,IAAIC,GAAiE,IAApD/E,EAAiBgF,WAAW/B,QAAQ6B,GACjDG,OAAuCtI,IAAtBoH,EAAOe,IAEvBC,GAAcE,IACjBL,EAAKE,GAAaf,EAAOe,GAE7B,GACF,CAOA9E,EAAiBgF,WAAa1C,OAAOC,KAAK,IAAIvC,GAO9CA,EAAiBgE,cAAgB,SAAUkB,GAEzC,GAAIA,aAAwBlF,EAAkB,OAAOkF,EAErD,IAAIC,EAAU,CAAC,EAwCf,GAtCiB,CACf,kBACA,eACA,iBACA,uBACA,sBACA,OACA,oBACA,WACA,sBACA,cACA,gBAGSN,SAAQ,SAAUO,GAC3B,IAAI5D,EAAQ0D,EAAaE,GACzB,GAAqB,kBAAV5D,EAAoB,CAC7B,IAAI6D,EAAcC,WAAW9D,GAE7B2D,EAAQC,GAAK9H,MAAM+H,GAAe7D,EAAQ6D,CAC5C,CACF,IAII9G,MAAMoF,QAAQuB,EAAaK,qBAC7BJ,EAAQI,kBAAoBL,EAAaK,kBAAkBC,KAAI,SAC7DC,GAEA,OAAIlH,MAAMoF,QAAQ8B,GACTA,EAAQD,KAAI,SAAUhE,GAC3B,OAAO8D,WAAW9D,EACpB,IAEKiE,CACT,KAGEP,EAAaT,mBAAoB,CACnC,IAAIA,EAAqB,CAAC,EAC1BnC,OAAOC,KAAK2C,EAAaT,oBAAoBI,SAAQ,SAAUtD,GAC7D,IAAImE,EAAYR,EAAaT,mBAAmBlD,IAAc,CAAC,EAC/DkD,EAAmBlD,GAAa,CAAC,EACjCe,OAAOC,KAAKmD,GAAWb,SAAQ,SAAUc,GACvC,IACIC,EADSF,EAAUC,GACGH,KAAI,SAAUxD,GACtC,OAAIzD,MAAMoF,QAAQ3B,GACTA,EAAEwD,KAAI,SAAUK,GACrB,MAAsB,kBAAXA,EACFP,WAAWO,GAEbA,CACT,IACsB,kBAAN7D,EACTsD,WAAWtD,GAEbA,CACT,IACAyC,EAAmBlD,GAAWoE,GAAYC,CAC5C,GACF,IACAT,EAAQV,mBAAqBA,CAC/B,CAEA,OAAOrB,EAAM,CAAC,EAAG8B,EAAcC,EACjC,EAQAnF,EAAiB8F,KAAO,SAA8BhC,GACpD,IAAIiC,EAAW,IAAI/F,EAAiB8D,GAyBpC,OAvByBA,EAAcO,oBAAsB,IAC1CQ,SAAQ,SAAUmB,GACnC,GAAIA,EAAMC,SAAU,CAClB,IAAIC,EAAoBH,EAASI,0BAA0BH,EAAMI,MAG/DF,EAAkBjI,OAAS,GACsB,IAAjDiI,EAAkB,GAAGjD,QAAQ+C,EAAMC,YAEnCF,EAAWA,EAASM,iBAAiBL,EAAMI,OAKZ,KADjCF,EAAoBH,EAASI,0BAA0BH,EAAMI,OACvCnI,SACpB8H,EAAWA,EAASO,kCAClBN,EAAMI,KACNJ,EAAMC,UAGZ,CACF,IAEOF,CACT,EAQA/F,EAAiBuG,SAAW,SAAUC,EAAcxF,GAClD,IAAI+C,EAAS/C,GAAc,CAAC,EAE5B,OACEwF,EAAaC,YACb1C,EAAOW,gBACPX,EAAOW,eAAezG,OAAS,EAExB,IAAIE,MACT,qLAKAqI,EAAa9B,eAAezG,OAAS,GAAK8F,EAAO0C,WAC5C,IAAItI,MACT,oKAMFqI,EAAaE,gBACb3C,EAAOU,oBACPvD,EAAc6C,EAAOU,oBAEd,IAAItG,MACT,+KAMA+C,EAAcsF,EAAa/B,qBAAuBV,EAAO2C,eACpD,IAAIvI,MACT,+KAMG,IACT,EAEA6B,EAAiB9C,UAAY,CAC3ByJ,YAAa3G,EAWbqG,iBAAkB,SAA0B9E,GAC1C,IAAIqF,EAAQ,CACVnC,mBAAoBjI,KAAKqK,yBAAyBtF,GAClD+C,kBAAmBf,EAAexB,gBAChCvF,KAAK8H,kBACL/C,EACA,oBAEFgD,eAAgBhB,EAAexB,gBAC7BvF,KAAK+H,eACLhD,EACA,WAEFiD,6BAA8BjB,EAAexB,gBAC3CvF,KAAKgI,6BACLjD,EACA,oBAEFoD,8BAA+BpB,EAAexB,gBAC5CvF,KAAKmI,8BACLpD,EACA,sBAGJ,OACEqF,EAAMnC,qBAAuBjI,KAAKiI,oBAClCmC,EAAMtC,oBAAsB9H,KAAK8H,mBACjCsC,EAAMrC,iBAAmB/H,KAAK+H,gBAC9BqC,EAAMpC,+BACJhI,KAAKgI,8BACPoC,EAAMjC,gCAAkCnI,KAAKmI,8BAEtCnI,KAEFA,KAAKsK,mBAAmBF,EACjC,EAMAG,UAAW,WACT,YAAwBpK,IAApBH,KAAKiK,YAA2D,IAA/BjK,KAAKkI,eAAezG,OAChDzB,KAEFA,KAAKsK,mBAAmB,CAC7BL,gBAAY9J,EACZ+H,eAAgB,IAEpB,EAOAsC,SAAU,SAAkB5G,GAC1B,OAAIA,IAAU5D,KAAK4D,MAAc5D,KAE1BA,KAAKsK,mBAAmB,CAC7B1G,MAAOA,GAEX,EAOA6G,SAAU,SAAkBC,GAC1B,OAAIA,IAAa1K,KAAK2K,MAAc3K,KAE7BA,KAAKsK,mBAAmB,CAC7BK,MAAOD,GAEX,EAOAE,QAAS,SAAiBC,GACxB,OAAIA,IAAY7K,KAAK8K,KAAa9K,KAE3BA,KAAKsK,mBAAmB,CAC7BQ,KAAMD,GAEV,EAQAE,UAAW,SAAmBpD,GAC5B,OAAO3H,KAAKsK,mBAAmB,CAC7B3C,OAAQA,GAEZ,EAQAqD,qBAAsB,SAA8BrD,GAClD,OAAO3H,KAAKsK,mBAAmB,CAC7B1C,kBAAmBD,GAEvB,EAQAsD,eAAgB,SAAwBpK,GACtC,OAAIb,KAAKkL,cAAgBrK,EAAUb,KAE5BA,KAAKsK,mBAAmB,CAC7BY,YAAarK,GAEjB,EAQAsK,iBAAkB,SAA0BC,GAC1C,OAAIpL,KAAKoL,gBAAkBA,EAAsBpL,KAE1CA,KAAKsK,mBAAmB,CAC7Bc,cAAeA,GAEnB,EAkBAC,qBAAsB,SAAUtG,EAAWoE,EAAUnE,GACnD,IAAIsG,EAAMzE,EAAY7B,GAEtB,GAAIhF,KAAKuL,iBAAiBxG,EAAWoE,EAAUmC,GAAM,OAAOtL,KAE5D,IAAIqF,EAAMuB,EAAM,CAAC,EAAG5G,KAAKiI,oBAazB,OAXA5C,EAAIN,GAAa6B,EAAM,CAAC,EAAGvB,EAAIN,IAE3BM,EAAIN,GAAWoE,IAEjB9D,EAAIN,GAAWoE,GAAY9D,EAAIN,GAAWoE,GAAUnH,QAEpDqD,EAAIN,GAAWoE,GAAU7G,KAAKgJ,IAE9BjG,EAAIN,GAAWoE,GAAY,CAACmC,GAGvBtL,KAAKsK,mBAAmB,CAC7BrC,mBAAoB5C,GAExB,EAMAmG,0BAA2B,SAAUC,GACnC,OAAKzL,KAAK0L,mBAAmBD,IAGtBzL,KAAK8H,kBAAkB2D,IAFrB,EAGX,EAMAE,0BAA2B,SAAUF,GACnC,OAAKzL,KAAK4L,mBAAmBH,IAGtBzL,KAAKgI,6BAA6ByD,IAFhC,EAGX,EAMA9B,0BAA2B,SAAU8B,GAGnC,OAAOzL,KAAKmI,8BAA8BsD,IAAc,EAC1D,EAMAI,sBAAuB,SAAUJ,GAC/B,OAAKzL,KAAK0L,mBAAmBD,IAGtBzL,KAAK+H,eAAe0D,IAFlB,EAGX,EAUAK,wBAAyB,SAAU/G,EAAWoE,EAAU4C,GACtD,IAAIC,EAAaD,EACjB,YAAmB5L,IAAf6L,EACGhM,KAAKuL,iBAAiBxG,EAAWoE,EAAU6C,GAGzChM,KAAKsK,mBAAmB,CAC7BrC,mBAAoBjI,KAAKqK,0BAAyB,SAChDrF,EACA7B,GAEA,OACEA,IAAQ4B,GACRC,EAAMiH,KAAO9C,GACbnC,EAAyBhC,EAAMsG,IAAKzE,EAAYmF,GAEpD,MAZOhM,UAcaG,IAAbgJ,EACJnJ,KAAKuL,iBAAiBxG,EAAWoE,GAC/BnJ,KAAKsK,mBAAmB,CAC7BrC,mBAAoBjI,KAAKqK,0BAAyB,SAChDrF,EACA7B,GAEA,OAAOA,IAAQ4B,GAAaC,EAAMiH,KAAO9C,CAC3C,MAPsDnJ,KAWrDA,KAAKuL,iBAAiBxG,GACpB/E,KAAKsK,mBAAmB,CAC7BrC,mBAAoBjI,KAAKqK,0BAAyB,SAAUrF,EAAO7B,GACjE,OAAOA,IAAQ4B,CACjB,MAJ4C/E,IAMhD,EAMAkM,sBAAuB,SAAUT,GAC/B,OAAOzL,KAAKiI,mBAAmBwD,IAAc,CAAC,CAChD,EAOAU,qBAAsB,SAAUpH,EAAWoE,GACzC,OACEnJ,KAAKiI,mBAAmBlD,IACxB/E,KAAKiI,mBAAmBlD,GAAWoE,EAEvC,EAWAkB,yBAA0B,SAAkCtF,GAC1D,QAAkB5E,IAAd4E,EACF,OAAKL,EAAc1E,KAAKiI,oBAGjB,CAAC,EAFCjI,KAAKiI,mBAGT,GAAyB,kBAAdlD,EAChB,OAAOJ,EAAK3E,KAAKiI,mBAAoB,CAAClD,IACjC,GAAyB,oBAAdA,EAA0B,CAC1C,IAAIa,GAAa,EACbqC,EAAqBjI,KAAKiI,mBAC1BmE,EAAwBtG,OAAOC,KAAKkC,GAAoBjC,QAC1D,SAAUC,EAAM9C,GACd,IAAI+F,EAAYjB,EAAmB9E,GAC/BkJ,EAAe,CAAC,EAsBpB,OApBAnD,EAAYA,GAAa,CAAC,EAC1BpD,OAAOC,KAAKmD,GAAWb,SAAQ,SAAUc,GACvC,IAAIjD,EAASgD,EAAUC,IAAa,GAChCmD,EAAY,GAChBpG,EAAOmC,SAAQ,SAAUrD,GACDD,EACpB,CAAEuG,IAAKtG,EAAOiH,GAAI9C,GAClBhG,EACA,YAEoBmJ,EAAUhK,KAAK0C,EACvC,IACIsH,EAAU7K,SAAWyE,EAAOzE,SAC9BmE,GAAa,GAEfyG,EAAalD,GAAYmD,CAC3B,IAEArG,EAAK9C,GAAOkJ,EAELpG,CACT,GACA,CAAC,GAGH,OAAIL,EAAmBwG,EAChBpM,KAAKiI,kBACd,CAKF,EAQAsE,SAAU,SAAkB/C,GAC1B,OAAIxJ,KAAK0L,mBAAmBlC,GACnBxJ,KAGFA,KAAKsK,mBAAmB,CAC7B3C,OAAQ3H,KAAK2H,OAAOvC,OAAO,CAACoE,KAEhC,EAQAgD,oBAAqB,SAA6BhD,GAChD,OAAIxJ,KAAK4L,mBAAmBpC,GACnBxJ,KAGFA,KAAKsK,mBAAmB,CAC7B1C,kBAAmB5H,KAAK4H,kBAAkBxC,OAAO,CAACoE,KAEtD,EASAiD,qBAAsB,SAA8BC,GAClD,GAAI1M,KAAK2M,oBAAoBD,EAAkB9C,MAC7C,MAAM,IAAIjI,MACR,+DACE+K,EAAkB9C,KAClB,KAIN,OAAO5J,KAAKsK,mBAAmB,CAC7BzC,mBAAoB7H,KAAK6H,mBAAmBzC,OAAO,CAACsH,KAExD,EAQAE,mBAAoB,SAA4BpD,EAAOxE,GACrD,IAAKhF,KAAK0L,mBAAmBlC,GAC3B,MAAM,IAAI7H,MACR6H,EACE,uEAGN,OAAIzC,EAAe9B,UAAUjF,KAAK8H,kBAAmB0B,EAAOxE,GACnDhF,KAEFA,KAAKsK,mBAAmB,CAC7BxC,kBAAmBf,EAAelC,cAChC7E,KAAK8H,kBACL0B,EACAxE,IAGN,EAQA6H,qBAAsB,SAA8BrD,EAAOxE,GACzD,IAAKhF,KAAK0L,mBAAmBlC,GAC3B,MAAM,IAAI7H,MACR6H,EACE,uEAGN,OAAIzC,EAAe9B,UAAUjF,KAAK+H,eAAgByB,EAAOxE,GAChDhF,KAEFA,KAAKsK,mBAAmB,CAC7BvC,eAAgBhB,EAAelC,cAC7B7E,KAAK+H,eACLyB,EACAxE,IAGN,EAQA8H,8BAA+B,SAC7BtD,EACAxE,GAEA,IAAKhF,KAAK4L,mBAAmBpC,GAC3B,MAAM,IAAI7H,MACR6H,EACE,kFAIN,OACEzC,EAAe9B,UAAUjF,KAAKgI,6BAA8BwB,EAAOxE,GAE5DhF,KAEFA,KAAKsK,mBAAmB,CAC7BtC,6BAA8BjB,EAAelC,cAC3C7E,KAAKgI,6BACLwB,EACAxE,IAGN,EAMA+H,iBAAkB,SAA0BC,GAC1C,GAAIhN,KAAKiN,aAAaD,GAAM,OAAOhN,KAEnC,IAAIkN,EAAe,CACjBhF,eAAgBlI,KAAKkI,eAAe9C,OAAO4H,IAG7C,OAAOhN,KAAKsK,mBAAmB4C,EACjC,EAQAC,YAAa,SAAqB3D,GAChC,OAAKxJ,KAAK0L,mBAAmBlC,GAItBxJ,KAAK6J,iBAAiBL,GAAOc,mBAAmB,CACrD3C,OAAQ3H,KAAK2H,OAAOvB,QAAO,SAAUX,GACnC,OAAOA,IAAM+D,CACf,MANOxJ,IAQX,EAQAoN,uBAAwB,SAAgC5D,GACtD,OAAKxJ,KAAK4L,mBAAmBpC,GAItBxJ,KAAK6J,iBAAiBL,GAAOc,mBAAmB,CACrD1C,kBAAmB5H,KAAK4H,kBAAkBxB,QAAO,SAAUX,GACzD,OAAOA,IAAM+D,CACf,MANOxJ,IAQX,EAQAqN,wBAAyB,SAAiC7D,GACxD,OAAKxJ,KAAK2M,oBAAoBnD,GAIvBxJ,KAAK6J,iBAAiBL,GAAOc,mBAAmB,CACrDzC,mBAAoB7H,KAAK6H,mBAAmBzB,QAAO,SAAUX,GAC3D,OAAOA,EAAEmE,OAASJ,CACpB,MANOxJ,IAQX,EAUAsN,sBAAuB,SAA+B9D,EAAOxE,GAC3D,IAAKhF,KAAK0L,mBAAmBlC,GAC3B,MAAM,IAAI7H,MACR6H,EACE,uEAGN,OAAKzC,EAAe9B,UAAUjF,KAAK8H,kBAAmB0B,EAAOxE,GAGtDhF,KAAKsK,mBAAmB,CAC7BxC,kBAAmBf,EAAezB,iBAChCtF,KAAK8H,kBACL0B,EACAxE,KANKhF,IASX,EAQAuN,wBAAyB,SAAiC/D,EAAOxE,GAC/D,IAAKhF,KAAK0L,mBAAmBlC,GAC3B,MAAM,IAAI7H,MACR6H,EACE,uEAGN,OAAKzC,EAAe9B,UAAUjF,KAAK+H,eAAgByB,EAAOxE,GAGnDhF,KAAKsK,mBAAmB,CAC7BvC,eAAgBhB,EAAezB,iBAC7BtF,KAAK+H,eACLyB,EACAxE,KANKhF,IASX,EAQAwN,iCAAkC,SAChChE,EACAxE,GAEA,IAAKhF,KAAK4L,mBAAmBpC,GAC3B,MAAM,IAAI7H,MACR6H,EACE,kFAGN,OACGzC,EAAe9B,UAAUjF,KAAKgI,6BAA8BwB,EAAOxE,GAI/DhF,KAAKsK,mBAAmB,CAC7BtC,6BAA8BjB,EAAezB,iBAC3CtF,KAAKgI,6BACLwB,EACAxE,KANKhF,IASX,EAOAyN,oBAAqB,SAA6BT,GAChD,IAAKhN,KAAKiN,aAAaD,GAAM,OAAOhN,KAEpC,IAAIkN,EAAe,CACjBhF,eAAgBlI,KAAKkI,eAAe9B,QAAO,SAAUsH,GACnD,OAAOA,IAAMV,CACf,KAGF,OAAOhN,KAAKsK,mBAAmB4C,EACjC,EAUAxH,iBAAkB,SAA0B8D,EAAOxE,GACjD,OAAOhF,KAAK2N,sBAAsBnE,EAAOxE,EAC3C,EASA2I,sBAAuB,SAA+BnE,EAAOxE,GAC3D,GAAIhF,KAAK2M,oBAAoBnD,GAC3B,OAAOxJ,KAAK8J,kCAAkCN,EAAOxE,GAChD,GAAIhF,KAAK0L,mBAAmBlC,GACjC,OAAOxJ,KAAK4N,iCAAiCpE,EAAOxE,GAC/C,GAAIhF,KAAK4L,mBAAmBpC,GACjC,OAAOxJ,KAAK6N,iCAAiCrE,EAAOxE,GAGtD,MAAM,IAAIrD,MACR,sCACE6H,EACA,6FAEN,EAQAoE,iCAAkC,SAChCpE,EACAxE,GAEA,IAAKhF,KAAK0L,mBAAmBlC,GAC3B,MAAM,IAAI7H,MACR6H,EACE,uEAIN,OAAOxJ,KAAKsK,mBAAmB,CAC7BxC,kBAAmBf,EAAerB,iBAChC1F,KAAK8H,kBACL0B,EACAxE,IAGN,EAQA8I,6BAA8B,SAC5BtE,EACAxE,GAEA,IAAKhF,KAAK0L,mBAAmBlC,GAC3B,MAAM,IAAI7H,MACR6H,EACE,uEAIN,OAAOxJ,KAAKsK,mBAAmB,CAC7BvC,eAAgBhB,EAAerB,iBAC7B1F,KAAK+H,eACLyB,EACAxE,IAGN,EAQA6I,iCAAkC,SAChCrE,EACAxE,GAEA,IAAKhF,KAAK4L,mBAAmBpC,GAC3B,MAAM,IAAI7H,MACR6H,EACE,kFAIN,OAAOxJ,KAAKsK,mBAAmB,CAC7BtC,6BAA8BjB,EAAerB,iBAC3C1F,KAAKgI,6BACLwB,EACAxE,IAGN,EAQA8E,kCAAmC,SACjCN,EACAxE,GAEA,IAAKhF,KAAK2M,oBAAoBnD,GAC5B,MAAM,IAAI7H,MACR6H,EACE,mFAIN,IAAIuE,EAAY/N,KAAKgO,+BACnBhO,KAAKiO,2BAA2BzE,IAG9BnE,EAAM,CAAC,EA2BX,YAxBgDlF,IAA9CH,KAAKmI,8BAA8BqB,IACnCxJ,KAAKmI,8BAA8BqB,GAAO/H,OAAS,IAGlDzB,KAAKmI,8BAA8BqB,GAAO,KAAOxE,GAO1C,IAFNhF,KAAKmI,8BAA8BqB,GAAO,GAAG/C,QAC3CzB,EAAQ+I,KAIsB,IAA9B/I,EAAMyB,QAAQsH,GAEhB1I,EAAImE,GAAS,GAEbnE,EAAImE,GAAS,CAACxE,EAAMhD,MAAM,EAAGgD,EAAMkJ,YAAYH,KAGjD1I,EAAImE,GAAS,CAACxE,GAGThF,KAAKsK,mBAAmB,CAC7BnC,8BAA+B1D,EAC7B,CAAC,EACDY,EACArF,KAAKmI,gCAGX,EASAgG,+BAAgC,SAAU3E,EAAO4E,GAC/C,GAAIpO,KAAKqO,2BAA2B7E,GAClC,MAAM,IAAI7H,MAAM6H,EAAQ,wBAE1B,IAAKxJ,KAAK2M,oBAAoBnD,GAC5B,MAAM,IAAI7H,MACR6H,EACE,oFAGN,IAAInE,EAAM,CAAC,EAEX,OADAA,EAAImE,GAAS,CAAC4E,GACPpO,KAAKsK,mBAAmB,CAC7BnC,8BAA+B1D,EAC7B,CAAC,EACDY,EACArF,KAAKmI,gCAGX,EAQAmG,kCAAmC,SAAU9E,GAC3C,IAAKxJ,KAAKqO,2BAA2B7E,GACnC,OAAOxJ,KAET,IAAIqF,EAAM,CAAC,EAEX,OADAA,EAAImE,GAAS,GACNxJ,KAAKsK,mBAAmB,CAC7BnC,8BAA+B1D,EAC7B,CAAC,EACDY,EACArF,KAAKmI,gCAGX,EAOAoG,oBAAqB,SAA6BvB,GAChD,OAAIhN,KAAKiN,aAAaD,GACbhN,KAAKyN,oBAAoBT,GAG3BhN,KAAK+M,iBAAiBC,EAC/B,EAOApB,mBAAoB,SAAUpC,GAC5B,OAAOxJ,KAAK4H,kBAAkBnB,QAAQ+C,IAAU,CAClD,EAOAmD,oBAAqB,SAAUlB,GAC7B,YAAsDtL,IAA/CH,KAAKiO,2BAA2BxC,EACzC,EAOAC,mBAAoB,SAAUlC,GAC5B,OAAOxJ,KAAK2H,OAAOlB,QAAQ+C,IAAU,CACvC,EAUAgF,eAAgB,SAAwBhF,EAAOxE,GAC7C,QAAKhF,KAAK0L,mBAAmBlC,IAGtBzC,EAAe9B,UAAUjF,KAAK8H,kBAAmB0B,EAAOxE,EACjE,EAWAyJ,iBAAkB,SAA0BjF,EAAOxE,GACjD,QAAKhF,KAAK0L,mBAAmBlC,IAGtBzC,EAAe9B,UAAUjF,KAAK+H,eAAgByB,EAAOxE,EAC9D,EAUA0J,0BAA2B,SAAmClF,EAAOxE,GACnE,QAAKhF,KAAK4L,mBAAmBpC,IAGtBzC,EAAe9B,UACpBjF,KAAKgI,6BACLwB,EACAxE,EAEJ,EAUAqJ,2BAA4B,SAC1B7E,EACAxE,GAEA,IAAKhF,KAAK2M,oBAAoBnD,GAC5B,OAAO,EAGT,IAAImF,EAAc3O,KAAK2J,0BAA0BH,GAEjD,OAAKxE,GAIkC,IAAhC2J,EAAYlI,QAAQzB,GAHlB2J,EAAYlN,OAAS,CAIhC,EAWA8J,iBAAkB,SAA0BxG,EAAWoE,EAAUnE,GAC/D,QAAc7E,IAAV6E,QAAoC7E,IAAbgJ,EACzB,OAAO5C,QAAQvG,KAAKiI,mBAAmBlD,IAGzC,IAAI6J,EACF5O,KAAKiI,mBAAmBlD,SACyB5E,IAAjDH,KAAKiI,mBAAmBlD,GAAWoE,GAErC,QAAchJ,IAAV6E,IAAwB4J,EAC1B,OAAOA,EAGT,IAr1CeC,EAAOC,EAq1ClBjG,EAAchC,EAAY7B,GAC1B+J,OAEF5O,KAx1Ca0O,EAu1CH7O,KAAKiI,mBAAmBlD,GAAWoE,GAv1CzB2F,EAu1CoCjG,EAt1CrDnC,EAAKmI,GAAO,SAAUG,GAC3B,OAAOhI,EAAyBgI,EAAcF,EAChD,KAu1CE,OAAOF,GAAqBG,CAC9B,EAOA9B,aAAc,SAAsBD,GAClC,OAA6C,IAAtChN,KAAKkI,eAAezB,QAAQuG,EACrC,EAQAiC,4BAA6B,WAE3B,IAAI7G,EAAOpI,KAGPkP,EAAkCvI,EACpCb,OAAOC,KAAK/F,KAAKiI,oBAAoB7B,QAAO,SAAUoD,GACpD,OAAO1D,OAAOC,KAAKqC,EAAKH,mBAAmBuB,IAAQ/H,OAAS,CAC9D,IACAzB,KAAK4H,mBAGP,OAAO9B,OAAOC,KAAK/F,KAAKgI,8BACrB5B,QAAO,SAAUoD,GAChB,OAAOpB,EAAKJ,6BAA6BwB,GAAO/H,OAAS,CAC3D,IACC2D,OAAO8J,GACP9J,OAAOpF,KAAKmP,gCACZC,MACL,EAQAD,6BAA8B,WAE5B,IAAI/G,EAAOpI,KACX,OAAO2G,EAGL3G,KAAK6H,mBAAmBmB,KAAI,SAAUQ,GACpC,OAAOA,EAAMI,IACf,IACA9D,OAAOC,KAAK/F,KAAKmI,+BAA+B/B,QAAO,SAAUoD,GAC/D,OAAOpB,EAAKD,8BAA8BqB,GAAO/H,OAAS,CAC5D,KACA2N,MACJ,EAMAC,8BAA+B,WAC7B,IAAIC,EAAgBtP,KAAKiP,8BAEzB,OAAOjP,KAAK4H,kBAAkBxB,QAAO,SAAUX,GAC7C,OAAqC,IAA9B6J,EAAc7I,QAAQhB,EAC/B,GACF,EAEA8J,kBAAmB,CACjB,QAEA,SACA,oBACA,oBACA,qBACA,iBAEA,+BACA,qBACA,iBACA,iCAGFC,eAAgB,WACd,IAAID,EAAoBvP,KAAKuP,kBAEzBE,EAAc,CAAC,EAGfrH,EAAOpI,KAWX,OAVA8F,OAAOC,KAAK/F,MAAMqI,SAAQ,SAAUC,GAClC,IAAI0D,EAAa5D,EAAKE,IAEsB,IAA1CiH,EAAkB9I,QAAQ6B,SACXnI,IAAf6L,IAEAyD,EAAYnH,GAAa0D,EAE7B,IAEOyD,CACT,EAWAC,kBAAmB,SAAsBC,EAAW3K,GAClD,GAAIhF,KAAK2P,KAAe3K,EAAO,OAAOhF,KAEtC,IAAIkN,EAAe,CAAC,EAIpB,OAFAA,EAAayC,GAAa3K,EAEnBhF,KAAKsK,mBAAmB4C,EACjC,EAOA5C,mBAAoB,SAA4B/C,GAC9C,IAAKA,EAAQ,OAAOvH,KAEpB,IAAIwB,EAAQgC,EAAiBuG,SAAS/J,KAAMuH,GAE5C,GAAI/F,EACF,MAAMA,EAIR,IAAI4G,EAAOpI,KACP4P,EAAkBpM,EAAiBgE,cAAcD,GACjDsI,EAAsB/J,OAAOC,KAAK/F,MAAMgG,QAAO,SAAU8J,EAAK3M,GAEhE,OADA2M,EAAI3M,GAAOiF,EAAKjF,GACT2M,CACT,GAAG,CAAC,GAEAC,EAAkBjK,OAAOC,KAAK6J,GAAiB5J,QAAO,SACxDgK,EACA7M,GAEA,IAAI8M,OAA2C9P,IAAlB6P,EAAS7M,GAClC+M,OAA8C/P,IAAzByP,EAAgBzM,GAEzC,OAAI8M,IAA2BC,EACtBvL,EAAKqL,EAAU,CAAC7M,KAGrB+M,IACFF,EAAS7M,GAAOyM,EAAgBzM,IAG3B6M,EACT,GACAH,GAEA,OAAO,IAAI7P,KAAKmK,YAAY4F,EAC9B,EAQAI,UAAW,WACT,YAAkBhQ,IAAdH,KAAK8K,KACA9K,KAGFA,KAAK4K,QAAQ,EACtB,EAOAwF,4BAA6B,SAAU1D,GACrC,OAAOA,EAAkB2D,QAAU,CAAC,iBAAkB,WACxD,EAQArC,+BAAgC,SAAUtB,GACxC,OAAOA,EAAkBqB,WAAa,KACxC,EAQAuC,yBAA0B,SAAU5D,GAClC,OAAOA,EAAkBjD,UAAY,IACvC,EAQA8G,gCAAiC,SAAU7D,GACzC,MAAiD,mBAAtCA,EAAkB8D,iBACpB9D,EAAkB8D,eAG7B,EAOAvC,2BAA4B,SAAUwC,GACpC,OAAO/J,EAAK1G,KAAK6H,oBAAoB,SAAUpC,GAC7C,OAAOA,EAAEmE,OAAS6G,CACpB,GACF,EAOAC,+BAAgC,SAAUjF,GACxC,IAAKzL,KAAK2M,oBAAoBlB,GAC5B,MAAO,GAGT,IAAIkF,EAAa3Q,KAAK2J,0BAA0B8B,GAAW,GAC3D,IAAKkF,EAAY,MAAO,GAExB,IAAI5C,EAAY/N,KAAKgO,+BACnBhO,KAAKiO,2BAA2BxC,IAGlC,OADWkF,EAAWC,MAAM7C,GAChB/E,KAAI,SAAU6H,GACxB,OAAOA,EAAKC,MACd,GACF,EAEAC,SAAU,WACR,OAAOC,KAAKC,UAAUjR,KAAM,KAAM,EACpC,GAYFQ,EAAOC,QAAU+C,sCCppDjBhD,EAAOC,QASP,SAAuByQ,GACrB,OAAO,SAAkBC,EAAyBC,GAChD,IAAI1E,EAAoBwE,EAAMrJ,mBAAmBuJ,GAC7CC,EACDH,EAAM/I,8BAA8BuE,EAAkB9C,OACrDsH,EAAM/I,8BAA8BuE,EAAkB9C,MAAM,IAC9D,GACE0H,EACFJ,EAAMlD,+BAA+BtB,GACnC6E,EACFL,EAAMZ,yBAAyB5D,GAC7B8E,EACFN,EAAMX,gCAAgC7D,GACpC2D,EAASoB,EACXP,EAAMd,4BAA4B1D,IAGhCgF,EAAiBP,EAAwB/J,OAAM,SAAUuK,GAC3D,OAAOA,EAAYC,UACrB,IAEIC,EA4BR,SACExB,EACAiB,EACAC,EACAC,EACA9H,GAEA,OAAO,SACLoI,EACAX,EACAY,GAEA,IAAIC,EAASF,EAEb,GAAIC,EAA2B,EAAG,CAChC,IAAIE,EAAQ,EAIZ,IAFAD,EAASF,EAEFG,EAAQF,GAA0B,CAIvC,IAAIG,EAAOF,GAAUjQ,MAAMoF,QAAQ6K,EAAOE,MAAQF,EAAOE,KAAO,GAChEF,EAAStL,EAAKwL,GAAM,SAAUC,GAC5B,OAAOA,EAAQlN,SACjB,IACAgN,GACF,CACF,CAGA,GAAID,EAAQ,CAYV,IAAII,EAAStM,OAAOC,KAAKoL,EAAwBe,MAC9ClJ,KAAI,SAAUqJ,GACb,MAAO,CAACA,EAAYlB,EAAwBe,KAAKG,GACnD,IACCjM,QAAO,SAAUkM,GAEhB,OAiCV,SACED,EACAE,EACA7I,EACA4H,EACAC,EACAC,GAGA,GACED,IAC8C,IAA7Cc,EAAW5L,QAAQ8K,IAClBA,IAAyBc,GAE3B,OAAO,EAIT,OACId,IAC+C,IAA/Cc,EAAW5L,QAAQ6K,IAEpBC,GACCc,EAAWzB,MAAMU,GAAuB7P,OACtC8P,EAAqBX,MAAMU,GAAuB7P,SAClD,IAG4C,IAA/C4Q,EAAW5L,QAAQ6K,KACoC,IAAtD5H,EAAkBjD,QAAQ6K,IAEc,IAA1C5H,EAAkBjD,QAAQ4L,IAEkC,IAA3DA,EAAW5L,QAAQ8L,EAAajB,KAC9BE,GAC2C,IAA1Ca,EAAW5L,QAAQiD,GAE3B,CAtEiB8I,CADUF,EAAM,GAGrBN,EAAO5D,MAAQmD,EACf7H,EACA4H,EACAC,EACAC,EAEJ,IAEFQ,EAAOE,KAAOO,EACZL,EAAOpJ,KAAI,SAAUsJ,GACnB,IAAID,EAAaC,EAAM,GAGvB,OAyDV,SACEI,EACAL,EACAf,EACA5H,EACAkI,GAEA,IAAIe,EAAQN,EAAWzB,MAAMU,GAC7B,MAAO,CACL1H,KAAM+I,EAAMA,EAAMlR,OAAS,GAAGqP,OAC9B1C,KAAMiE,EACNO,aAAcC,EAAiBR,GAC/BS,MAAOJ,EACPzN,UACEyE,IAAsB2I,GAC4C,IAAlE3I,EAAkBjD,QAAQ4L,EAAaf,GACzCM,WAAYA,EACZM,KAAM,KAEV,CA5EiBa,CAFUT,EAAM,GAIrBD,EACAf,EACA0B,EAAmBtJ,GACnByH,EAAwBS,WAE5B,IACAvB,EAAO,GACPA,EAAO,GAEX,CAEA,OAAOyB,CACT,CACF,CA5GyBmB,CACnB5C,EACAiB,EACAC,EACAC,EACAH,GAGE6B,EAAU/B,EAQd,OANII,IACF2B,EAAU/B,EAAwBnP,MAChCuP,EAAqBX,MAAMU,GAAuB7P,SAI/CyR,EAAQlN,OAAO6L,EAAgB,CACpCjI,KAAMsH,EAAMrJ,mBAAmBuJ,GAAwBxH,KACvDkJ,MAAO,KACP7N,WAAW,EACXmJ,KAAM,KACNwE,aAAc,KACdhB,WAAYF,EACZQ,KAAM,MAEV,CACF,EAtDA,IAAIiB,EAAK,EAAQ,OACbzM,EAAO,EAAQ,OACf+K,EAAiC,EAAQ,OACzCgB,EAAU,EAAQ,OAClBI,EAAmBM,EAAGN,iBACtBG,EAAqBG,EAAGH,uDCP5B,IAAII,EAAU,EAAQ,OAClB3O,EAAe,EAAQ,OACvB0O,EAAK,EAAQ,OACbzM,EAAO,EAAQ,OACf2M,EAAY,EAAQ,OACpBC,EAAa,EAAQ,OACrB1M,EAAQ,EAAQ,MAChB6L,EAAU,EAAQ,OAClBI,EAAmBM,EAAGN,iBACtBG,EAAqBG,EAAGH,mBAExBC,EAA2B,EAAQ,OAgDvC,SAASM,EAAWC,GAClB,IAAIC,EAAU,CAAC,EAMf,OAJAD,EAAWnL,SAAQ,SAAUiD,EAAKoI,GAChCD,EAAQnI,GAAOoI,CACjB,IAEOD,CACT,CAEA,SAASE,EAAiBC,EAAMC,EAAY1Q,GACtC0Q,GAAcA,EAAW1Q,KAC3ByQ,EAAKE,MAAQD,EAAW1Q,GAE5B,CA6JA,SAASM,EAAcyN,EAAOgC,EAASa,GACrC,IAAIC,EAAkBd,EAAQ,GAE9BlT,KAAKiU,YAAcf,EAGnB,IAAI9K,EAAOpI,KAGX8F,OAAOC,KAAKiO,GAAiB3L,SAAQ,SAAUlF,GAC7CiF,EAAKjF,GAAO6Q,EAAgB7Q,EAC9B,IAGA2C,OAAOC,KAAKgO,GAAW,CAAC,GAAG1L,SAAQ,SAAUlF,GAC3CiF,EAAKjF,GAAO4Q,EAAQ5Q,EACtB,IA8IAnD,KAAKkU,iBAAmBhB,EAAQlN,QAAO,SAAUmO,EAAKC,GACpD,YAAmCjU,IAA5BiU,EAAOF,iBACVC,EACAA,EAAMC,EAAOF,gBACnB,GAAG,GAMHlU,KAAK4H,kBAAoB,GAKzB5H,KAAK6H,mBAAqBqJ,EAAMrJ,mBAAmBmB,KACjD,WACE,MAAO,EACT,IAMFhJ,KAAK2H,OAAS,GAEd,IAAIC,EAAoBsJ,EAAMjC,8BAE1BoF,EAAgBd,EAAWrC,EAAMvJ,QACjC2M,EAA2Bf,EAAWrC,EAAMtJ,mBAC5C2M,EAAwB,EAKxBC,EAAaR,EAAgBrM,QAAU,CAAC,EAE5C7B,OAAOC,KAAKyO,GAAYnM,SAAQ,SAAUoM,GACxC,IAnVF5M,EACA6M,EAkVMC,EAAmBH,EAAWC,GAE9B/H,GArVN7E,EAsVIqJ,EAAMrJ,mBArVV6M,EAsVID,EApVG/N,EACLmB,GACA,SAAkC6E,GAEhC,OADiBA,EAAkB8G,YAAc,IAC/B/M,QAAQiO,IAA8B,CAC1D,KAkVA,GAAIhI,EAAmB,CAGrB,IAAIkI,EAAalI,EAAkB8G,WAAW/M,QAAQgO,GAClDI,EAAmBxB,EAAUnC,EAAMrJ,oBAAoB,SAAUpC,GACnE,OAAOA,EAAEmE,OAAS8C,EAAkB9C,IACtC,IACAxB,EAAKP,mBAAmBgN,GAAkBD,GAAc,CACtD7P,UAAW0P,EACXvC,KAAMyC,EACN/C,WAAYoC,EAAgBc,sBAEhC,KAAO,CACL,IAEI9R,EAFA+R,GAAoE,IAA/C7D,EAAMtJ,kBAAkBnB,QAAQgO,GACrDO,GAAyD,IAApC9D,EAAMvJ,OAAOlB,QAAQgO,GAG1CM,IACF/R,EAAWsR,EAAyBG,GACpCrM,EAAKR,kBAAkB5E,GAAY,CACjC4G,KAAM6K,EACNvC,KAAMyC,EACN/C,WAAYoC,EAAgBc,uBAE9BnB,EACEvL,EAAKR,kBAAkB5E,GACvBgR,EAAgBiB,aAChBR,IAGAO,IACFhS,EAAWqR,EAAcI,GACzBrM,EAAKT,OAAO3E,GAAY,CACtB4G,KAAM6K,EACNvC,KAAMyC,EACN/C,WAAYoC,EAAgBc,uBAE9BnB,EACEvL,EAAKT,OAAO3E,GACZgR,EAAgBiB,aAChBR,GAGN,CACF,IAGAzU,KAAK6H,mBAAqBuL,EAAQpT,KAAK6H,oBAGvCD,EAAkBS,SAAQ,SAAU6M,GAClC,IAAId,EAASlB,EAAQqB,GACjB5M,EAASyM,GAAUA,EAAOzM,OAASyM,EAAOzM,OAAS,CAAC,EACpD+E,EAAoBwE,EAAMjD,2BAA2BiH,GAGzDpP,OAAOC,KAAK4B,GAAQU,SAAQ,SAAU8M,GACpC,IAEInS,EAFAoS,EAAezN,EAAOwN,GAI1B,GAAIzI,EAAmB,CACrB1J,EAAWqQ,EAAUnC,EAAMrJ,oBAAoB,SAAUpC,GACvD,OAAOA,EAAEmE,OAAS8C,EAAkB9C,IACtC,IACA,IAAIyL,EAAiBhC,EACnBjL,EAAKP,mBAAmB7E,IACxB,SAAUyC,GACR,OAAOA,EAAEV,YAAcoQ,CACzB,IAIF,IAAwB,IAApBE,EACF,OAGFjN,EAAKP,mBAAmB7E,GAAUqS,GAAgBnD,KAAOtL,EACvD,CAAC,EACDwB,EAAKP,mBAAmB7E,GAAUqS,GAAgBnD,KAClDkD,EAEJ,KAAO,CACLpS,EAAWsR,EAAyBa,GAEpC,IAAIG,EACDtB,EAAgBrM,QAAUqM,EAAgBrM,OAAOwN,IAAY,CAAC,EAEjE/M,EAAKR,kBAAkB5E,GAAY,CACjC4G,KAAMuL,EACNjD,KAAMzN,EAAa,CAAC,EAAG2Q,EAAcE,GACrC1D,WAAYwC,EAAOU,uBAErBnB,EACEvL,EAAKR,kBAAkB5E,GACvBoR,EAAOa,aACPE,GAGEjE,EAAMlJ,6BAA6BmN,IACrCjE,EAAMlJ,6BAA6BmN,GAAQ9M,SAAQ,SACjDhC,IAIG+B,EAAKR,kBAAkB5E,GAAUkP,KAAK7L,IACvC6K,EAAMlJ,6BAA6BmN,GAAQ1O,QACzCuM,EAAmB3M,KAChB,IAEL+B,EAAKR,kBAAkB5E,GAAUkP,KAAK7L,GAAmB,EAE7D,GAEJ,CACF,IACAkO,GACF,IAGArD,EAAM/B,+BAA+B9G,SAAQ,SAAUkN,GACrD,IAAI7I,EAAoBwE,EAAMjD,2BAA2BsH,GACrDxH,EAAYmD,EAAMlD,+BAA+BtB,GAEjDhD,EAAoBwH,EAAMvH,0BAA0B4L,GAIzB,IAA7B7L,EAAkBjI,QAClBiI,EAAkB,GAAGkH,MAAM7C,GAAWtM,OAAS,GAKjDyR,EAAQlR,MAAMuS,GAAuBlM,SAAQ,SAAU+L,GACrD,IAAIzM,EAASyM,GAAUA,EAAOzM,OAASyM,EAAOzM,OAAS,CAAC,EAExD7B,OAAOC,KAAK4B,GAAQU,SAAQ,SAAU8M,GACpC,IAAIC,EAAezN,EAAOwN,GACtBnS,EAAWqQ,EAAUnC,EAAMrJ,oBAAoB,SAAUpC,GAC3D,OAAOA,EAAEmE,OAAS8C,EAAkB9C,IACtC,IACIyL,EAAiBhC,EACnBjL,EAAKP,mBAAmB7E,IACxB,SAAUyC,GACR,OAAOA,EAAEV,YAAcoQ,CACzB,IAIF,IAAwB,IAApBE,EAAJ,CAYA,IAAIG,EAAc,CAAC,EAEnB,GAAI9L,EAAkBjI,OAAS,EAAG,CAChC,IAAIgU,EAAO/L,EAAkB,GAAGkH,MAAM7C,GAAW,GACjDyH,EAAYC,GACVrN,EAAKP,mBAAmB7E,GAAUqS,GAAgBnD,KAAKuD,EAC3D,CAEArN,EAAKP,mBAAmB7E,GAAUqS,GAAgBnD,KAAOzN,EACvD+Q,EACAJ,EACAhN,EAAKP,mBAAmB7E,GAAUqS,GAAgBnD,KArBpD,CAuBF,IAEAqC,GACF,GACF,IAGAzO,OAAOC,KAAKmL,EAAMnJ,gBAAgBM,SAAQ,SAAUoD,GAClD,IAAIiK,EAAWxE,EAAMnJ,eAAe0D,GAChCzI,EAAWqR,EAAc5I,GAE7BrD,EAAKT,OAAO3E,GAAY,CACtB4G,KAAM6B,EACNyG,KAAMsC,EAAW/I,GACjBmG,WAAYoC,EAAgBc,uBAE9BY,EAASrN,SAAQ,SAAUgK,GACzBjK,EAAKT,OAAO3E,GAAYoF,EAAKT,OAAO3E,IAAa,CAAE4G,KAAM6B,GACzDrD,EAAKT,OAAO3E,GAAUkP,KAAO9J,EAAKT,OAAO3E,GAAUkP,MAAQ,CAAC,EAC5D9J,EAAKT,OAAO3E,GAAUkP,KAAKG,GAAc,CAC3C,GACF,IAKArS,KAAK6H,mBAAqB7H,KAAK6H,mBAAmBmB,IAChDiK,EAAyB/B,IAM3BlR,KAAK2H,OAASyL,EAAQpT,KAAK2H,QAI3B3H,KAAK4H,kBAAoBwL,EAAQpT,KAAK4H,mBAEtC5H,KAAK2V,OAASzE,CAChB,CA2BA,SAAS0E,EAA6B1C,EAASnO,GAC7C,SAAS8Q,EAAUrM,GACjB,OAAOA,EAAMI,OAAS7E,CACxB,CAEA,GAAImO,EAAQyC,OAAOjK,mBAAmB3G,GAAY,CAChD,IAAIyE,EAAQ9C,EAAKwM,EAAQvL,OAAQkO,GACjC,OAAKrM,EAEE1D,OAAOC,KAAKyD,EAAM0I,MAAMlJ,KAAI,SAAUY,GAC3C,IAAI5E,EAAQ6N,EAAiBjJ,GAC7B,MAAO,CACLA,KAAMA,EACNgJ,aAAc5N,EACd8N,MAAOtJ,EAAM0I,KAAKtI,GAClB3E,UAAWiO,EAAQyC,OAAOnH,eAAezJ,EAAWC,GACpD8Q,WAAY5C,EAAQyC,OAAOlH,iBAAiB1J,EAAW6E,GAE3D,IAXmB,EAYrB,CAAO,GAAIsJ,EAAQyC,OAAO/J,mBAAmB7G,GAAY,CACvD,IAAImQ,EAAmBxO,EAAKwM,EAAQtL,kBAAmBiO,GACvD,OAAKX,EAEEpP,OAAOC,KAAKmP,EAAiBhD,MAAMlJ,KAAI,SAAUY,GACtD,IAAI5E,EAAQ6N,EAAiBjJ,GAC7B,MAAO,CACLA,KAAMA,EACNgJ,aAAc5N,EACd8N,MAAOoC,EAAiBhD,KAAKtI,GAC7B3E,UAAWiO,EAAQyC,OAAOjH,0BAA0B3J,EAAWC,GAEnE,IAV8B,EAWhC,CAAO,GAAIkO,EAAQyC,OAAOhJ,oBAAoB5H,GAAY,CACxD,IAAIgR,EAA0BrP,EAAKwM,EAAQrL,mBAAoBgO,GAC/D,IAAKE,EAAyB,OAAOA,EAErC,IAAIrJ,EACFwG,EAAQyC,OAAO1H,2BAA2BlJ,GACxCgJ,EACFmF,EAAQyC,OAAO3H,+BAA+BtB,GAC5ChD,EAAoBsJ,EACtBE,EAAQyC,OAAOhM,0BAA0B5E,GAAW,IAAM,IAGE,IAA1D2E,EAAkBjD,QAAQiG,EAAkBjD,YAC9CC,EAAoBA,EAAkBsM,QACpCtJ,EAAkBjD,SAAWsE,EAC7B,KAIJ,IAAIkI,EAAyBvM,EAAkBkH,MAAM7C,GAKrD,OAJAkI,EAAuBC,QAAQnR,GAE/BoR,EAAaJ,EAAyBE,EAAwB,GAEvDF,CACT,CAGF,CASA,SAASI,EAAaC,EAAM1M,EAAmB2M,GAC7CD,EAAKnR,UAAYmR,EAAKxM,OAASF,EAAkB2M,GAC7CD,EAAKlE,MACPkE,EAAKlE,KAAK7J,SAAQ,SAAUiO,GAC1BH,EAAaG,EAAO5M,EAAmB2M,EAAQ,EACjD,GAEJ,CAWA,SAASE,EAAQC,EAAQC,EAAMC,EAAOzE,GAGpC,GAFAA,EAAQA,GAAS,EAEblQ,MAAMoF,QAAQsP,GAChB,OAAOD,EAAOC,EAAMC,EAAMzE,IAG5B,IAAKwE,EAAKvE,MAA6B,IAArBuE,EAAKvE,KAAKzQ,OAC1B,OAAOgV,EAGT,IAAIE,EAAWF,EAAKvE,KAAKlJ,KAAI,SAAU4N,GACrC,OAAOL,EAAQC,EAAQI,EAAWF,EAAOzE,EAAQ,EACnD,IACI4E,EAAiBL,EAAOG,EAAUD,EAAMzE,IAE5C,OADcxN,EAAa,CAAEyN,KAAM2E,GAAkBJ,EAEvD,CA2MA,SAASK,EAAyB3Q,EAAWsF,GAC3C,IAAIyG,EAAOxL,EAAKP,GAAW,SAAUqD,GACnC,OAAOA,EAAMI,OAAS6B,CACxB,IACA,OAAOyG,GAAQA,EAAK4B,KACtB,CAwGA,SAASiD,EAAc7F,EAAOjQ,EAAM+V,EAAepN,EAAMqN,GACvD,IAAIzN,EAAQ9C,EAAKuQ,GAAe,SAAUxR,GACxC,OAAOA,EAAEmE,OAASoN,CACpB,IACIlE,EAAQtJ,GAASA,EAAM0I,MAAQ1I,EAAM0I,KAAKtI,GAAQJ,EAAM0I,KAAKtI,GAAQ,EACrEgI,EAAcpI,GAASA,EAAMoI,aAAe,EAEhD,MAAO,CACL3Q,KAAMA,EACN+V,cAAeA,EACfpN,KAAMA,EACNkJ,MAAOA,EACPlB,WAAYA,EAEhB,CAjcAnO,EAAc/C,UAAUwW,eAAiB,SAAUtN,GACjD,SAASiM,EAAUrM,GACjB,OAAOA,EAAMI,OAASA,CACxB,CAEA,OACElD,EAAK1G,KAAK2H,OAAQkO,IAClBnP,EAAK1G,KAAK4H,kBAAmBiO,IAC7BnP,EAAK1G,KAAK6H,mBAAoBgO,EAElC,EAmHApS,EAAc0T,aAAe,CAAC,iBAAkB,aAAc,YA+H9D1T,EAAc/C,UAAU0W,eAAiB,SAAUrS,EAAWlB,GAC5D,IAAIwT,EAAczB,EAA6B5V,KAAM+E,GACrD,GAAKsS,EAAL,CAIA,IASI7D,EATAO,EAAUtP,EAAa,CAAC,EAAGZ,EAAM,CACnCwM,OAAQ5M,EAAc0T,aAGtBG,gBAAiBzT,GAAQA,EAAKwM,UAI5B6C,EAAUlT,KAEd,GAAI+B,MAAMoF,QAAQkQ,GAChB7D,EAAa,CAACzO,QAGdyO,EADaN,EAAQyC,OAAO1H,2BAA2BoJ,EAAYzN,MAC/C4J,WAGtB,OAAO+C,GACL,SAAUrE,EAAMzG,GACd,GAAIsI,EAAQuD,cAAe,CACzB,IAAIA,EAnFZ,SAA0BpE,EAASnO,GACjC,OACEmO,EAAQqE,kBACRrE,EAAQqE,iBAAiBD,eACzBpE,EAAQqE,iBAAiBD,cAAcpR,QACvCgN,EAAQqE,iBAAiBD,cAAcpR,OAAOnB,EAElD,CA4E4ByS,CAAiBtE,EAASzH,GAC9C,GAAI6L,EACF,OAxIV,SAA8BD,EAAaC,GACzC,IAAIG,EAAgB,GAChBC,EAAkB,GAOlBC,GALQL,EAAcM,OAAS,IAKV5R,QAAO,SAAU8J,EAAKlG,EAAMtI,GAEnD,OADAwO,EAAIlG,GAAQtI,EACLwO,CACT,GAAG,CAAC,GAEJuH,EAAYhP,SAAQ,SAAU+N,GAE5B,IAAIxM,EAAOwM,EAAKhI,MAAQgI,EAAKxM,UACFzJ,IAAvBwX,EAAa/N,GACf6N,EAAcE,EAAa/N,IAASwM,EAEpCsB,EAAgBpV,KAAK8T,EAEzB,IAEAqB,EAAgBA,EAAcrR,QAAO,SAAUoD,GAC7C,OAAOA,CACT,IAEA,IACIqO,EADAC,EAAkBR,EAAcQ,gBAEpC,MAAwB,WAApBA,EACKL,GAEPI,EAD6B,UAApBC,EACE,CACT,CAAC,OAAQ,QACT,CAAC,MAAO,QAGC,CAAC,CAAC,SAAU,CAAC,SAGnBL,EAAcrS,OACnBqN,EAAQiF,EAAiBG,EAAS,GAAIA,EAAS,KAEnD,CA4FiBE,CAAqB7F,EAAMoF,EAEtC,CAEA,GAAIvV,MAAMoF,QAAQ4M,EAAQ1D,QAAS,CACjC,IAAIuH,EAAQtE,EAAWS,EAAQ1D,OAAQ5M,EAAc0T,cACrD,OAAO1E,EAAQP,EAAM0F,EAAM,GAAIA,EAAM,GACvC,CAAO,GAA8B,oBAAnB7D,EAAQ1D,OACxB,OAjKR,SAAuBuH,EAAO1F,GAC5B,OAAOA,EAAK9C,KAAKwI,EACnB,CA+JeI,CAAcjE,EAAQ1D,OAAQ6B,GAEvC,MAAM,IAAIvQ,MACR,oHAGJ,GACA0V,EACA7D,EAxCF,CA0CF,EAQA/P,EAAc/C,UAAUuX,cAAgB,SAAUlT,GAChD,OAAI/E,KAAK2V,OAAOjK,mBAAmB3G,GAC1B+R,EAAyB9W,KAAK2H,OAAQ5C,GACpC/E,KAAK2V,OAAO/J,mBAAmB7G,GACjC+R,EAAyB9W,KAAK4H,kBAAmB7C,QADnD,CAKT,EA+BAtB,EAAc/C,UAAUwX,eAAiB,WACvC,IAAIhH,EAAQlR,KAAK2V,OAEbzC,EAAUlT,KACVmY,EAAM,GAoEV,OAlEArS,OAAOC,KAAKmL,EAAMpJ,mBAAmBO,SAAQ,SAAU2O,GACrD9F,EAAMpJ,kBAAkBkP,GAAe3O,SAAQ,SAAUuB,GACvDuO,EAAI7V,KACFyU,EAAc7F,EAAO,QAAS8F,EAAepN,EAAMsJ,EAAQvL,QAE/D,GACF,IAEA7B,OAAOC,KAAKmL,EAAMnJ,gBAAgBM,SAAQ,SAAU2O,GAClD9F,EAAMnJ,eAAeiP,GAAe3O,SAAQ,SAAUuB,GACpDuO,EAAI7V,KACFyU,EAAc7F,EAAO,UAAW8F,EAAepN,EAAMsJ,EAAQvL,QAEjE,GACF,IAEA7B,OAAOC,KAAKmL,EAAMlJ,8BAA8BK,SAAQ,SACtD2O,GAEA9F,EAAMlJ,6BAA6BgP,GAAe3O,SAAQ,SAAUuB,GAClEuO,EAAI7V,KACFyU,EACE7F,EACA,cACA8F,EACApN,EACAsJ,EAAQtL,mBAGd,GACF,IAEA9B,OAAOC,KAAKmL,EAAM/I,+BAA+BE,SAAQ,SACvD2O,GAEA9F,EAAM/I,8BAA8B6O,GAAe3O,SAAQ,SAAUuB,GACnEuO,EAAI7V,KAuEV,SAAmC4O,EAAO8F,EAAepN,EAAMqN,GAC7D,IAAImB,EAAmBlH,EAAMjD,2BAA2B+I,GACpDjJ,EAAYmD,EAAMlD,+BAA+BoK,GACjDxH,EAAQhH,EAAKgH,MAAM7C,GACnBsK,EAAY3R,EAAKuQ,GAAe,SAAUzN,GAC5C,OAAOA,EAAMI,OAASoN,CACxB,IAEIxN,EAAQoH,EAAM5K,QAAO,SAAUsS,EAAmBzH,GACpD,IAAI0H,EACFD,GACA5R,EAAK4R,EAAkBpG,MAAM,SAAUzM,GACrC,OAAOA,EAAEmE,OAASiH,CACpB,IACF,YAAoB1Q,IAAboY,EAAyBA,EAAWD,CAC7C,GAAGD,GAECvF,EAAStJ,GAASA,EAAMsJ,OAAU,EAClClB,EAAcpI,GAASA,EAAMoI,aAAe,EAC5CxD,EAAQ5E,GAASA,EAAM4E,MAAS,GAEpC,MAAO,CACLnN,KAAM,eACN+V,cAAeA,EACfpN,KAAMwE,EACN0E,MAAOA,EACPlB,WAAYA,EAEhB,CAlGQjI,CACEuH,EACA8F,EACApN,EACAsJ,EAAQrL,oBAGd,GACF,IAEA/B,OAAOC,KAAKmL,EAAMjJ,oBAAoBI,SAAQ,SAAU2O,GACtD,IAAI9N,EAAYgI,EAAMjJ,mBAAmB+O,GACzClR,OAAOC,KAAKmD,GAAWb,SAAQ,SAAUc,GACvCD,EAAUC,GAAUd,SAAQ,SAAUrD,GACpCmT,EAAI7V,KAAK,CACPrB,KAAM,UACN+V,cAAeA,EACfpN,KAAM5E,EACNwT,aAAcxT,EACdmE,SAAUA,GAEd,GACF,GACF,IAEA+H,EAAMhJ,eAAeG,SAAQ,SAAUuB,GACrCuO,EAAI7V,KAAK,CAAErB,KAAM,MAAO+V,cAAe,QAASpN,KAAMA,GACxD,IAEOuO,CACT,EAsEA3X,EAAOC,QAAUgD,sCCxnCjB,IAAI1D,EAAe,EAAQ,OAEvBgE,EAAgB,EAAQ,OACxB8O,EAAmB,0BACnBzO,EAAW,EAAQ,OACnBwC,EAAQ,EAAQ,MAChBlC,EAAgB,EAAQ,OACxBC,EAAO,EAAQ,OACf8T,EAAiB,EAAQ,OACzBjV,EAAmB,EAAQ,OAC3BC,EAAgB,EAAQ,OACxBK,EAAU,EAAQ,OAyGtB,SAASP,EAAoBI,EAAQC,EAAOmQ,GACJ,oBAA3BpQ,EAAO+U,iBAChB/U,EAAO+U,gBAAgB,cAAgB5U,EAAU,KAGnD9D,KAAK2Y,UAAUhV,GACf,IAAIE,EAAOkQ,GAAW,CAAC,EACvBlQ,EAAKD,MAAQA,EACb5D,KAAKkR,MAAQ1N,EAAiB8F,KAAKzF,GACnC7D,KAAKmE,YAAc,KACnBnE,KAAK4Y,SAAW,EAChB5Y,KAAK6Y,sBAAwB,EAC7B7Y,KAAK8Y,eAAiB,GACtB9Y,KAAK+Y,kBAAoB,CAC3B,CAszBA,SAASC,EAAelO,GACtB,GAAIA,EAAO,EAAG,MAAM,IAAInJ,MAAM,2BAO9B,OALA3B,KAAKiZ,QAAQ,CACX/H,MAAOlR,KAAKkR,MAAMtG,QAAQE,GAC1BoO,aAAa,IAGRlZ,IACT,CA8MA,SAASmZ,IACP,OAAOnZ,KAAKkR,MAAMpG,IACpB,CA7gCA1G,EAASb,EAAqBxD,GAa9BwD,EAAoB7C,UAAU0Y,OAAS,WAErC,OADApZ,KAAKqZ,QAAQ,CAAEC,wBAAwB,IAChCtZ,IACT,EAEAuD,EAAoB7C,UAAU6Y,6BAA+B,WAE3D,OADAvZ,KAAKqZ,QAAQ,CAAEC,wBAAwB,IAChCtZ,IACT,EAOAuD,EAAoB7C,UAAU8Y,SAAW,WACvC,IAAItI,EAAQlR,KAAKkR,MACjB,OAAOuH,EAAegB,qBAAqBvI,EAC7C,EAsCA3N,EAAoB7C,UAAUgZ,WAAa,SAAU3F,EAAS4F,GAC5D,IAAIC,EAAa7F,EAEb/T,KAAKkR,MAAM5G,mBAAmByJ,GAD9B/T,KAAKkR,MAEL2I,EAAUpB,EAAeqB,YAAYF,EAAUhW,MAAOgW,GAEtDxR,EAAOpI,KAQX,GANAA,KAAK+Y,oBAEL/Y,KAAKgB,KAAK,aAAc,CACtBkQ,MAAO0I,KAGLD,EAuBJ,OAAO3Z,KAAK2D,OAAOyV,OAAOS,GAASE,MACjC,SAAUC,GAGR,OAFA5R,EAAK2Q,oBAC0B,IAA3B3Q,EAAK2Q,mBAAyB3Q,EAAKpH,KAAK,oBACrC,CACLgZ,QAAS,IAAIvW,EAAcmW,EAAWI,EAAQ9G,SAC9ChC,MAAO0I,EACPK,kBAAmBD,EAEvB,IACA,SAAUE,GAGR,MAFA9R,EAAK2Q,oBAC0B,IAA3B3Q,EAAK2Q,mBAAyB3Q,EAAKpH,KAAK,oBACtCkZ,CACR,IApCAla,KAAK2D,OACFyV,OAAOS,GACPE,MAAK,SAAUC,GACd5R,EAAK2Q,oBAC0B,IAA3B3Q,EAAK2Q,mBACP3Q,EAAKpH,KAAK,oBAGZ2Y,EAAG,KAAM,IAAIlW,EAAcmW,EAAWI,EAAQ9G,SAAU0G,EAC1D,IACCO,OAAM,SAAUvY,GACfwG,EAAK2Q,oBAC0B,IAA3B3Q,EAAK2Q,mBACP3Q,EAAKpH,KAAK,oBAGZ2Y,EAAG/X,EAAK,KAAMgY,EAChB,GAqBN,EAaArW,EAAoB7C,UAAU0Z,YAAc,SAAUrG,GAEpDvR,QAAQkF,KAAK,yDACb,IAAIwJ,EAAQlR,KAAKkR,MACbmJ,EAAgBra,KAAK8Y,eAAe,GACxC,IAAKuB,EACH,OAAOC,QAAQC,QAAQ,IAEzB,IAAIC,EAAeH,EAAc9V,iBAAiB2M,GAC9CgB,EAAOtL,EACT,CACE6T,wBAAyB1G,EAAQ0G,wBACjCC,OAAQ3G,EAAQ2G,QAElB,CACEnT,OAAQ5C,EAAK8T,EAAegB,qBAAqBe,GAAe,CAC9D,sBACA,cACA,+BACA,0BAKFG,EACF,8GACF,GAAqC,oBAA1B3a,KAAK2D,OAAOiX,UACrB,MAAM,IAAIjZ,MAAMgZ,GAElB,IAAI/W,EAAQ5D,KAAK2D,OAAOiX,UAAUJ,EAAa5W,OAC/C,GAAiC,oBAAtBA,EAAMwW,YACf,MAAM,IAAIzY,MAAMgZ,GAElB,OAAO/W,EAAMwW,YAAYI,EAAa7P,MAAOoJ,EAAQ8G,eAAgB3I,EACvE,EAoCA3O,EAAoB7C,UAAUoa,qBAAuB,SACnDtR,EACAmB,EACAoQ,EACAC,GAEA,IAAIC,EAA4D,oBAArCjb,KAAK2D,OAAOmX,qBACnCI,EAAsD,oBAA1Blb,KAAK2D,OAAOiX,UAC5C,IACGK,IACAC,GAC6B,oBAAvBlb,KAAK2D,OAAOyV,OAEnB,MAAM,IAAIzX,MACR,yKAIJ,IAAIuP,EAAQlR,KAAKkR,MAAM5G,mBAAmB0Q,GAAa,CAAC,GACpDG,EAAgBjK,EAAMtF,mBAAmBpC,GACzC4R,EAAe3C,EAAe4C,uBAChC7R,EACAmB,EACAoQ,EACA7J,GAGFlR,KAAK+Y,oBAEL,IACIuC,EADAlT,EAAOpI,KAoCX,OAjCIib,EACFK,EAA8Btb,KAAK2D,OAAOmX,qBAAqB,CAC7D,CAAES,UAAWrK,EAAMtN,MAAO2D,OAAQ6T,KAG3BF,EACTI,EAA8Btb,KAAK2D,OAChCiX,UAAU1J,EAAMtN,OAChBkX,qBAAqBM,WAIjBA,EAAa3P,UACpB6P,EAA8Btb,KAAK2D,OAChCyV,OAAO,CACN,CACEnY,KAAM,QACNuI,MAAOA,EACP+R,UAAWrK,EAAMtN,MACjB2D,OAAQ6T,KAGXrB,MAAK,SAAyByB,GAC7B,OAAOA,EAAStI,QAAQ,EAC1B,KAGJlT,KAAKgB,KAAK,uBAAwB,CAChCkQ,MAAOA,EACP1H,MAAOA,EACPmB,MAAOA,IAGF2Q,EAA4BvB,MACjC,SAAsBC,GAapB,OAZA5R,EAAK2Q,oBAC0B,IAA3B3Q,EAAK2Q,mBAAyB3Q,EAAKpH,KAAK,qBAE5CgZ,EAAUjY,MAAMoF,QAAQ6S,GAAWA,EAAQ,GAAKA,GAExCyB,UAAUpT,SAAQ,SAAU5C,GAClCA,EAAEmN,aAAeC,EAAiBpN,EAAET,OACpCS,EAAER,UAAYkW,EACVjK,EAAMxC,0BAA0BlF,EAAO/D,EAAEmN,cACzC1B,EAAM1C,eAAehF,EAAO/D,EAAEmN,aACpC,IAEOoH,CACT,IACA,SAAUE,GAGR,MAFA9R,EAAK2Q,oBAC0B,IAA3B3Q,EAAK2Q,mBAAyB3Q,EAAKpH,KAAK,oBACtCkZ,CACR,GAEJ,EAWA3W,EAAoB7C,UAAU+J,SAAW,SAAUiR,GAMjD,OALA1b,KAAKiZ,QAAQ,CACX/H,MAAOlR,KAAKkR,MAAMf,YAAY1F,SAASiR,GACvCxC,aAAa,IAGRlZ,IACT,EAyBAuD,EAAoB7C,UAAUmJ,iBAAmB,SAAUD,GAMzD,OALA5J,KAAKiZ,QAAQ,CACX/H,MAAOlR,KAAKkR,MAAMf,YAAYtG,iBAAiBD,GAC/CsP,aAAa,IAGRlZ,IACT,EAUAuD,EAAoB7C,UAAU6J,UAAY,WAMxC,OALAvK,KAAKiZ,QAAQ,CACX/H,MAAOlR,KAAKkR,MAAMf,YAAY5F,YAC9B2O,aAAa,IAGRlZ,IACT,EAaAuD,EAAoB7C,UAAUoM,8BAAgC,SAC5DtD,EACAxE,GAOA,OALAhF,KAAKiZ,QAAQ,CACX/H,MAAOlR,KAAKkR,MAAMf,YAAYrD,8BAA8BtD,EAAOxE,GACnEkU,aAAa,IAGRlZ,IACT,EAMAuD,EAAoB7C,UAAUib,qBAAuB,WACnD,OAAO3b,KAAK8M,8BAA8B7K,MAAMjC,KAAM0B,UACxD,EAeA6B,EAAoB7C,UAAUyN,+BAAiC,SAC7D3E,EACA4E,GAOA,OALApO,KAAKiZ,QAAQ,CACX/H,MAAOlR,KAAKkR,MAAMf,YAAYhC,+BAA+B3E,EAAO4E,GACpE8K,aAAa,IAGRlZ,IACT,EAcAuD,EAAoB7C,UAAU2K,qBAAuB,SACnDtG,EACAoE,EACAnE,GASA,OAPAhF,KAAKiZ,QAAQ,CACX/H,MAAOlR,KAAKkR,MACTf,YACA9E,qBAAqBtG,EAAWoE,EAAUnE,GAC7CkU,aAAa,IAGRlZ,IACT,EAaAuD,EAAoB7C,UAAUkM,mBAAqB,SAAUpD,EAAOxE,GAMlE,OALAhF,KAAKiZ,QAAQ,CACX/H,MAAOlR,KAAKkR,MAAMf,YAAYvD,mBAAmBpD,EAAOxE,GACxDkU,aAAa,IAGRlZ,IACT,EAMAuD,EAAoB7C,UAAUkb,UAAY,WACxC,OAAO5b,KAAK4M,mBAAmB3K,MAAMjC,KAAM0B,UAC7C,EAaA6B,EAAoB7C,UAAUmb,kBAAoB,SAAUrS,EAAOxE,GAMjE,OALAhF,KAAKiZ,QAAQ,CACX/H,MAAOlR,KAAKkR,MAAMf,YAAYtD,qBAAqBrD,EAAOxE,GAC1DkU,aAAa,IAGRlZ,IACT,EAMAuD,EAAoB7C,UAAUob,WAAa,WACzC,OAAO9b,KAAK6b,kBAAkB5Z,MAAMjC,KAAM0B,UAC5C,EAYA6B,EAAoB7C,UAAUqb,OAAS,SAAU/O,GAM/C,OALAhN,KAAKiZ,QAAQ,CACX/H,MAAOlR,KAAKkR,MAAMf,YAAYpD,iBAAiBC,GAC/CkM,aAAa,IAGRlZ,IACT,EAoBAuD,EAAoB7C,UAAUoL,wBAA0B,SACtD/G,EACAoE,EACAnE,GASA,OAPAhF,KAAKiZ,QAAQ,CACX/H,MAAOlR,KAAKkR,MACTf,YACArE,wBAAwB/G,EAAWoE,EAAUnE,GAChDkU,aAAa,IAGRlZ,IACT,EAgBAuD,EAAoB7C,UAAU8M,iCAAmC,SAC/DhE,EACAxE,GASA,OAPAhF,KAAKiZ,QAAQ,CACX/H,MAAOlR,KAAKkR,MACTf,YACA3C,iCAAiChE,EAAOxE,GAC3CkU,aAAa,IAGRlZ,IACT,EAMAuD,EAAoB7C,UAAUsb,wBAA0B,WACtD,OAAOhc,KAAKwN,iCAAiCvL,MAAMjC,KAAM0B,UAC3D,EAUA6B,EAAoB7C,UAAU4N,kCAAoC,SAChE9E,GAOA,OALAxJ,KAAKiZ,QAAQ,CACX/H,MAAOlR,KAAKkR,MAAMf,YAAY7B,kCAAkC9E,GAChE0P,aAAa,IAGRlZ,IACT,EAgBAuD,EAAoB7C,UAAU4M,sBAAwB,SAAU9D,EAAOxE,GAMrE,OALAhF,KAAKiZ,QAAQ,CACX/H,MAAOlR,KAAKkR,MAAMf,YAAY7C,sBAAsB9D,EAAOxE,GAC3DkU,aAAa,IAGRlZ,IACT,EAMAuD,EAAoB7C,UAAUub,aAAe,WAC3C,OAAOjc,KAAKsN,sBAAsBrL,MAAMjC,KAAM0B,UAChD,EAgBA6B,EAAoB7C,UAAUwb,qBAAuB,SAAU1S,EAAOxE,GAMpE,OALAhF,KAAKiZ,QAAQ,CACX/H,MAAOlR,KAAKkR,MAAMf,YAAY5C,wBAAwB/D,EAAOxE,GAC7DkU,aAAa,IAGRlZ,IACT,EAMAuD,EAAoB7C,UAAUyb,cAAgB,WAC5C,OAAOnc,KAAKkc,qBAAqBja,MAAMjC,KAAM0B,UAC/C,EAYA6B,EAAoB7C,UAAU0b,UAAY,SAAUpP,GAMlD,OALAhN,KAAKiZ,QAAQ,CACX/H,MAAOlR,KAAKkR,MAAMf,YAAY1C,oBAAoBT,GAClDkM,aAAa,IAGRlZ,IACT,EAaAuD,EAAoB7C,UAAU2b,qBAAuB,SAAU7S,EAAOxE,GAMpE,OALAhF,KAAKiZ,QAAQ,CACX/H,MAAOlR,KAAKkR,MAAMf,YAAYrC,6BAA6BtE,EAAOxE,GAClEkU,aAAa,IAGRlZ,IACT,EAMAuD,EAAoB7C,UAAU4b,cAAgB,WAC5C,OAAOtc,KAAKqc,qBAAqBpa,MAAMjC,KAAM0B,UAC/C,EAiBA6B,EAAoB7C,UAAUgF,iBAAmB,SAAU8D,EAAOxE,GAChE,OAAOhF,KAAK2N,sBAAsBnE,EAAOxE,EAC3C,EAgBAzB,EAAoB7C,UAAUiN,sBAAwB,SAAUnE,EAAOxE,GAMrE,OALAhF,KAAKiZ,QAAQ,CACX/H,MAAOlR,KAAKkR,MAAMf,YAAYxC,sBAAsBnE,EAAOxE,GAC3DkU,aAAa,IAGRlZ,IACT,EAMAuD,EAAoB7C,UAAU6b,aAAe,WAC3C,OAAOvc,KAAK2N,sBAAsB1L,MAAMjC,KAAM0B,UAChD,EAYA6B,EAAoB7C,UAAU8b,UAAY,SAAUxP,GAMlD,OALAhN,KAAKiZ,QAAQ,CACX/H,MAAOlR,KAAKkR,MAAMf,YAAY5B,oBAAoBvB,GAClDkM,aAAa,IAGRlZ,IACT,EAWAuD,EAAoB7C,UAAU+b,SAAW,WACvC,IAAI3R,EAAO9K,KAAKkR,MAAMpG,MAAQ,EAC9B,OAAO9K,KAAK4K,QAAQE,EAAO,EAC7B,EAWAvH,EAAoB7C,UAAUgc,aAAe,WAC3C,IAAI5R,EAAO9K,KAAKkR,MAAMpG,MAAQ,EAC9B,OAAO9K,KAAK4K,QAAQE,EAAO,EAC7B,EA4BAvH,EAAoB7C,UAAUsY,eAAiBA,EAU/CzV,EAAoB7C,UAAUkK,QAAUoO,EAWxCzV,EAAoB7C,UAAU8J,SAAW,SAAUZ,GAMjD,OALA5J,KAAKiZ,QAAQ,CACX/H,MAAOlR,KAAKkR,MAAMf,YAAY3F,SAASZ,GACvCsP,aAAa,IAGRlZ,IACT,EAmBAuD,EAAoB7C,UAAUgP,kBAAoB,SAAUC,EAAW3K,GAMrE,OALAhF,KAAKiZ,QAAQ,CACX/H,MAAOlR,KAAKkR,MAAMf,YAAYT,kBAAkBC,EAAW3K,GAC3DkU,aAAa,IAGRlZ,IACT,EASAuD,EAAoB7C,UAAUic,SAAW,SAAUC,GAMjD,OALA5c,KAAKiZ,QAAQ,CACX/H,MAAO1N,EAAiB8F,KAAKsT,GAC7B1D,aAAa,IAGRlZ,IACT,EAmBAuD,EAAoB7C,UAAUmc,0CAC5B,SAAUD,GAER,OADA5c,KAAKkR,MAAQ,IAAI1N,EAAiBoZ,GAC3B5c,IACT,EAyBFuD,EAAoB7C,UAAUoc,eAAiB,SAAU/X,GACvD,QAAIL,EAAc1E,KAAKkR,MAAMhF,sBAAsBnH,MAExC/E,KAAKkR,MAAMxF,mBAAmB3G,GAChC/E,KAAKkR,MAAM1C,eAAezJ,GACxB/E,KAAKkR,MAAMtF,mBAAmB7G,GAChC/E,KAAKkR,MAAMxC,0BAA0B3J,KACnC/E,KAAKkR,MAAMvE,oBAAoB5H,IACjC/E,KAAKkR,MAAM7C,2BAA2BtJ,GASjD,EAqBAxB,EAAoB7C,UAAUoV,WAAa,SAAUtM,EAAOxE,GAC1D,OAAOhF,KAAKkR,MAAMzC,iBAAiBjF,EAAOxE,EAC5C,EAMAzB,EAAoB7C,UAAUqc,qBAAuB,SAAUvT,EAAOxE,GACpE,OAAOhF,KAAKkR,MAAMxC,0BAA0BlF,EAAOxE,EACrD,EAOAzB,EAAoB7C,UAAUsc,OAAS,SAAUhQ,GAC/C,OAAOhN,KAAKkR,MAAMjE,aAAaD,EACjC,EAMAzJ,EAAoB7C,UAAUuM,aAAe,WAC3C,OAAOjN,KAAKid,kBAAkBhb,MAAMjC,KAAM0B,UAC5C,EASA6B,EAAoB7C,UAAUwc,SAAW,WACvC,OAAOld,KAAKkR,MAAMtN,KACpB,EAWAL,EAAoB7C,UAAUyY,eAAiBA,EAM/C5V,EAAoB7C,UAAUyc,QAAUhE,EAOxC5V,EAAoB7C,UAAU0c,QAAU,WACtC,OAAOpd,KAAKkR,MAAMhJ,cACpB,EA8CA3E,EAAoB7C,UAAUwX,eAAiB,SAAUzM,GACvD,IAAIkD,EAAc,GAElB,GAAI3O,KAAKkR,MAAMxF,mBAAmBD,GACVzL,KAAKkR,MAAM1F,0BAA0BC,GAE3CpD,SAAQ,SAAUgV,GAChC1O,EAAYrM,KAAK,CACf0C,MAAOqY,EACPpc,KAAM,eAEV,IAEyBjB,KAAKkR,MAAMrF,sBAAsBJ,GAEvCpD,SAAQ,SAAUgV,GACnC1O,EAAYrM,KAAK,CACf0C,MAAOqY,EACPpc,KAAM,WAEV,SACK,GAAIjB,KAAKkR,MAAMtF,mBAAmBH,GAAY,CAEjDzL,KAAKkR,MAAMvF,0BAA0BF,GAEhBpD,SAAQ,SAAUgV,GACvC1O,EAAYrM,KAAK,CACf0C,MAAOqY,EACPpc,KAAM,eAEV,GACF,CAEA,IAAIgH,EAAqBjI,KAAKkR,MAAMhF,sBAAsBT,GAY1D,OAVA3F,OAAOC,KAAKkC,GAAoBI,SAAQ,SAAUc,GAChD,IAAInE,EAAQiD,EAAmBkB,GAE/BwF,EAAYrM,KAAK,CACf0C,MAAOA,EACPmE,SAAUA,EACVlI,KAAM,WAEV,IAEO0N,CACT,EAQApL,EAAoB7C,UAAUyL,qBAAuB,SACnDpH,EACAoE,GAEA,OAAOnJ,KAAKkR,MAAM/E,qBAAqBpH,EAAWoE,EACpD,EAOA5F,EAAoB7C,UAAUgQ,+BAAiC,SAC7DjF,GAEA,OAAOzL,KAAKkR,MAAMR,+BAA+BjF,EACnD,EAcAlI,EAAoB7C,UAAU2Y,QAAU,SAAUtF,GAChD,IAAI7C,EAAQlR,KAAKkR,MACboM,EAAS,GACTC,EAAc,GAEbxJ,EAAQuF,yBACXiE,EAAc9E,EAAeqB,YAAY5I,EAAMtN,MAAOsN,GAEtDoM,EAAOhb,KAAK,CACV4O,MAAOA,EACPsM,aAAcD,EAAY9b,OAC1Bgc,OAAQzd,OAGVA,KAAKgB,KAAK,SAAU,CAClBkQ,MAAOA,EACPgC,QAASlT,KAAKmE,eAIlB,IAAIuZ,EAAiB1d,KAAK8Y,eAAe9P,KAAI,SAAUqR,GACrD,IAAIG,EAAeH,EAAc9V,iBAAiB2M,GAC9CyM,EAAsBnD,EAAa5W,MACnC6U,EAAeqB,YAAYU,EAAa5W,MAAO4W,GAC/C,GAaJ,OAXA8C,EAAOhb,KAAK,CACV4O,MAAOsJ,EACPgD,aAAcG,EAAoBlc,OAClCgc,OAAQpD,IAGVA,EAAcrZ,KAAK,SAAU,CAC3BkQ,MAAOsJ,EACPtH,QAASmH,EAAclW,cAGlBwZ,CACT,IAEI9D,EAAU9X,MAAMrB,UAAU0E,OAAOnD,MAAMsb,EAAaG,GAEpDE,EAAU5d,KAAK4Y,WAGnB,GAFA5Y,KAAK+Y,qBAEAc,EAAQpY,OACX,OAAO6Y,QAAQC,QAAQ,CAAErH,QAAS,KAAM6G,KACtC/Z,KAAK6d,yBAAyBC,KAAK9d,KAAMsd,EAAQM,IAIrD,IACE5d,KAAK2D,OACFyV,OAAOS,GACPE,KAAK/Z,KAAK6d,yBAAyBC,KAAK9d,KAAMsd,EAAQM,IACtDzD,MAAMna,KAAK+d,sBAAsBD,KAAK9d,KAAM4d,GACjD,CAAE,MAAOpc,GAEPxB,KAAKgB,KAAK,QAAS,CACjBQ,MAAOA,GAEX,CAGF,EAYA+B,EAAoB7C,UAAUmd,yBAA2B,SACvDP,EACAM,EACA5D,GAIA,KAAI4D,EAAU5d,KAAK6Y,sBAAnB,CAKA7Y,KAAK+Y,mBAAqB6E,EAAU5d,KAAK6Y,qBACzC7Y,KAAK6Y,qBAAuB+E,EAEG,IAA3B5d,KAAK+Y,mBAAyB/Y,KAAKgB,KAAK,oBAE5C,IAAIkS,EAAU8G,EAAQ9G,QAAQlR,QAE9Bsb,EAAOjV,SAAQ,SAAU2V,GACvB,IAAI9M,EAAQ8M,EAAE9M,MACVsM,EAAeQ,EAAER,aACjBC,EAASO,EAAEP,OACXQ,EAAkB/K,EAAQjQ,OAAO,EAAGua,GAEnCtM,EAAMtN,OAQX6Z,EAAOtZ,YAAc,IAAIV,EAAcyN,EAAO+M,GAE9CR,EAAOzc,KAAK,SAAU,CACpBkS,QAASuK,EAAOtZ,YAChB+M,MAAOA,KAXPuM,EAAOzc,KAAK,SAAU,CACpBkS,QAAS,KACThC,MAAOA,GAWb,GA7BA,CA8BF,EAEA3N,EAAoB7C,UAAUqd,sBAAwB,SACpDH,EACApc,GAEIoc,EAAU5d,KAAK6Y,uBAKnB7Y,KAAK+Y,mBAAqB6E,EAAU5d,KAAK6Y,qBACzC7Y,KAAK6Y,qBAAuB+E,EAE5B5d,KAAKgB,KAAK,QAAS,CACjBQ,MAAOA,IAGsB,IAA3BxB,KAAK+Y,mBAAyB/Y,KAAKgB,KAAK,oBAC9C,EAEAuC,EAAoB7C,UAAUwd,mBAAqB,SACjDvT,EACAwT,EACAjU,EACAD,GAEA,OACEU,GACwB,IAAxBwT,EAAa1c,QACa,IAA1ByI,EAAezI,QACO,IAAtBwI,EAAWxI,MAEf,EAQA8B,EAAoB7C,UAAU0d,2BAA6B,SAAU5U,GACnE,OACExJ,KAAKkR,MAAMmN,uBAAuB7U,IAClCxJ,KAAKkR,MAAMmN,uBAAuB7U,GAAO/H,OAAS,CAEtD,EAEA8B,EAAoB7C,UAAUuY,QAAU,SAAUqF,GAChD,IAAIpN,EAAQoN,EAAMpN,MACdgI,EAAcoF,EAAMpF,YAEpBhI,IAAUlR,KAAKkR,QACjBlR,KAAKkR,MAAQA,EAEblR,KAAKgB,KAAK,SAAU,CAClBkQ,MAAOlR,KAAKkR,MACZgC,QAASlT,KAAKmE,YACd+U,YAAaA,IAGnB,EAMA3V,EAAoB7C,UAAU6d,WAAa,WAEzC,OADIve,KAAK2D,OAAO4a,YAAYve,KAAK2D,OAAO4a,aACjCve,IACT,EAQAuD,EAAoB7C,UAAUiY,UAAY,SAAU6F,GAClD,OAAIxe,KAAK2D,SAAW6a,IAEqB,oBAA9BA,EAAU9F,iBACnB8F,EAAU9F,gBAAgB,cAAgB5U,EAAU,KAEtD9D,KAAK2D,OAAS6a,GALwBxe,IAQxC,EAMAuD,EAAoB7C,UAAU+d,UAAY,WACxC,OAAOze,KAAK2D,MACd,EAqBAJ,EAAoB7C,UAAUge,OAAS,SAAUza,GAC/C,IAAIoW,EAAgB,IAAItW,EAAc/D,KAAMiE,GAE5C,OADAjE,KAAK8Y,eAAexW,KAAK+X,GAClBA,CACT,EAUA9W,EAAoB7C,UAAU4D,oBAAsB,SAAU+V,GAC5D,IAAIsE,EAAM3e,KAAK8Y,eAAerS,QAAQ4T,GACtC,IAAa,IAATsE,EAAY,MAAM,IAAIhd,MAAM,mCAChC3B,KAAK8Y,eAAe7V,OAAO0b,EAAK,EAClC,EAMApb,EAAoB7C,UAAUke,mBAAqB,WACjD,OAAO5e,KAAK+Y,kBAAoB,CAClC,EAkBAvY,EAAOC,QAAU8C,kCC7jDjB/C,EAAOC,QAAU,SAAiBoO,GAChC,OAAK9M,MAAMoF,QAAQ0H,GAIZA,EAAMzI,OAAOG,SAHX,EAIX,kCCJA/F,EAAOC,QAAU,WAGf,OAFcsB,MAAMrB,UAAUsB,MAAMF,KAAKJ,WAE1Bmd,aAAY,SAAU/O,EAAKgP,GAWxC,OAVAhZ,OAAOC,KAAKD,OAAOgZ,IAASzW,SAAQ,SAAUlF,QACxBhD,IAAhB2e,EAAO3b,UAGMhD,IAAb2P,EAAI3M,WAEC2M,EAAI3M,GAEb2M,EAAI3M,GAAO2b,EAAO3b,GACpB,IACO2M,CACT,GAAG,CAAC,EACN,kCCMAtP,EAAOC,QAAU,CACfoS,iBAnBF,SAA0B7N,GACxB,MAAqB,kBAAVA,EAA2BA,EAE/B+Z,OAAO/Z,GAAOgR,QAAQ,KAAM,MACrC,EAgBEhD,mBARF,SAA4BhO,GAC1B,MAAqB,kBAAVA,EAA2BA,EAE/BA,EAAMgR,QAAQ,OAAQ,IAC/B,mCCrBAxV,EAAOC,QAAU,SAAcoO,EAAOmQ,GACpC,GAAKjd,MAAMoF,QAAQ0H,GAInB,IAAK,IAAIvN,EAAI,EAAGA,EAAIuN,EAAMpN,OAAQH,IAChC,GAAI0d,EAAWnQ,EAAMvN,IACnB,OAAOuN,EAAMvN,EAKnB,kCCZAd,EAAOC,QAAU,SAAcoO,EAAOmQ,GACpC,IAAKjd,MAAMoF,QAAQ0H,GACjB,OAAQ,EAGV,IAAK,IAAIvN,EAAI,EAAGA,EAAIuN,EAAMpN,OAAQH,IAChC,GAAI0d,EAAWnQ,EAAMvN,IACnB,OAAOA,EAGX,OAAQ,CACV,sCCZA,IAAIoF,EAAO,EAAQ,OAQnBlG,EAAOC,QAAU,SAAoB4P,EAAQ4O,GAC3C,IAAIC,GAAuBD,GAAY,IAAIjW,KAAI,SAAUoG,GACvD,OAAOA,EAAKwB,MAAM,IACpB,IAEA,OAAOP,EAAOrK,QACZ,SAA0BmZ,EAAK/P,GAC7B,IAAIgQ,EAAkBhQ,EAAKwB,MAAM,KAE7ByO,EAAkB3Y,EACpBwY,GACA,SAAUI,GACR,OAAOA,EAAmB,KAAOF,EAAgB,EACnD,IAGF,OAAIA,EAAgB3d,OAAS,IAAM4d,GACjCF,EAAI,GAAG7c,KAAK8c,EAAgB,IAC5BD,EAAI,GAAG7c,KAAK8c,EAAgB,IACrBD,IAGTA,EAAI,GAAG7c,KAAK+c,EAAgB,IAC5BF,EAAI,GAAG7c,KAAK+c,EAAgB,IACrBF,EACT,GACA,CAAC,GAAI,IAET,kCCzBA3e,EAAOC,QAXP,SAAkB8e,EAAMC,GACtBD,EAAK7e,UAAYoF,OAAO2Z,OAAOD,EAAU9e,UAAW,CAClDyJ,YAAa,CACXnF,MAAOua,EACPG,YAAY,EACZC,UAAU,EACVC,cAAc,IAGpB,iCCAApf,EAAOC,QATP,SAAsBof,EAAMC,GAC1B,OAAOD,EAAKzZ,QAAO,SAAUpB,EAAOpB,GAClC,OACEkc,EAAKrZ,QAAQzB,IAAU,GACvB6a,EAAKpZ,QAAQzB,KAAWpB,CAE5B,GACF,iCCAA,SAASmc,EAA0B/a,GACjC,MACmB,oBAAVA,GACPjD,MAAMoF,QAAQnC,IAC4B,oBAA1Cc,OAAOpF,UAAUqQ,SAASjP,KAAKkD,EAEnC,CAEA,SAASgb,EAAOC,EAAQnB,GACtB,GAAImB,IAAWnB,EACb,OAAOmB,EAIT,IAAK,IAAI9c,KAAO2b,EACd,GACGhZ,OAAOpF,UAAUwf,eAAepe,KAAKgd,EAAQ3b,IACtC,cAARA,GACQ,gBAARA,EAHF,CASA,IAAIgd,EAAYrB,EAAO3b,GACnBid,EAAYH,EAAO9c,GAEE,qBAAdid,GAAkD,qBAAdD,IAM7CJ,EAA0BK,IAC1BL,EAA0BI,GAE1BF,EAAO9c,GAAO6c,EAAOI,EAAWD,GAEhCF,EAAO9c,GA5CU,kBADR6B,EA6CWmb,IA5CmB,OAAVnb,EACxBgb,EAAOje,MAAMoF,QAAQnC,GAAS,GAAK,CAAC,EAAGA,GAEzCA,EAyBL,CA7BJ,IAAeA,EAgDb,OAAOib,CACT,CAgCAzf,EAAOC,QAfP,SAAewf,GACRF,EAA0BE,KAC7BA,EAAS,CAAC,GAGZ,IAAK,IAAI3e,EAAI,EAAG+e,EAAI3e,UAAUD,OAAQH,EAAI+e,EAAG/e,IAAK,CAChD,IAAIwd,EAASpd,UAAUJ,GAEnBye,EAA0BjB,IAC5BkB,EAAOC,EAAQnB,EAEnB,CACA,OAAOmB,CACT,kCC3EAzf,EAAOC,QAJP,SAAuB6f,GACrB,OAAOA,GAAOxa,OAAOC,KAAKua,GAAK7e,OAAS,CAC1C,kCCcAjB,EAAOC,QAfP,SAAuCqe,EAAQyB,GAC7C,GAAe,OAAXzB,EAAiB,MAAO,CAAC,EAC7B,IAEI3b,EACA7B,EAHA2e,EAAS,CAAC,EACVO,EAAa1a,OAAOC,KAAK+Y,GAG7B,IAAKxd,EAAI,EAAGA,EAAIkf,EAAW/e,OAAQH,IACjC6B,EAAMqd,EAAWlf,GAEbif,EAAS9Z,QAAQtD,IAAQ,IAC7B8c,EAAO9c,GAAO2b,EAAO3b,IAEvB,OAAO8c,CACT,kCCdA,SAASQ,EAAiBzb,EAAO0b,GAC/B,GAAI1b,IAAU0b,EAAO,CACnB,IAAIC,OAAyBxgB,IAAV6E,EACf4b,EAAsB,OAAV5b,EAEZ6b,OAAyB1gB,IAAVugB,EACfI,EAAsB,OAAVJ,EAEhB,IACII,GAAa9b,EAAQ0b,GACtBE,GAAaC,IACbF,EAED,OAAO,EAET,IACIC,GAAa5b,EAAQ0b,GACtBI,GAAaH,IACbE,EAED,OAAQ,CAEZ,CACA,OAAO,CACT,CAqDArgB,EAAOC,QA7CP,SAAiBsgB,EAAYC,EAAWC,GACtC,IAAKlf,MAAMoF,QAAQ4Z,GACjB,MAAO,GAGJhf,MAAMoF,QAAQ8Z,KACjBA,EAAS,IAGX,IAAI7M,EAAS2M,EAAW/X,KAAI,SAAUhE,EAAOpB,GAC3C,MAAO,CACLsd,SAAUF,EAAUhY,KAAI,SAAUmY,GAChC,OAAOnc,EAAMmc,EACf,IACAvd,MAAOA,EACPoB,MAAOA,EAEX,IAuBA,OArBAoP,EAAOhF,MAAK,SAAkBgS,EAAQV,GAGpC,IAFA,IAAI9c,GAAS,IAEJA,EAAQwd,EAAOF,SAASzf,QAAQ,CACvC,IAAI0W,EAAMsI,EAAiBW,EAAOF,SAAStd,GAAQ8c,EAAMQ,SAAStd,IAClE,GAAIuU,EACF,OAAIvU,GAASqd,EAAOxf,OACX0W,EAEa,SAAlB8I,EAAOrd,IACDuU,EAEHA,CAEX,CAIA,OAAOiJ,EAAOxd,MAAQ8c,EAAM9c,KAC9B,IAEOwQ,EAAOpL,KAAI,SAAUmP,GAC1B,OAAOA,EAAInT,KACb,GACF,kCC7DAxE,EAAOC,QAdP,SAASoG,EAAYrB,GACnB,GAAiB,kBAANA,EACT,OAAOA,EACF,GAAiB,kBAANA,EAChB,OAAOsD,WAAWtD,GACb,GAAIzD,MAAMoF,QAAQ3B,GACvB,OAAOA,EAAEwD,IAAInC,GAGf,MAAM,IAAIlF,MACR,wEAEJ,sCCZA,IAAIiF,EAAQ,EAAQ,MAEpB,SAASya,EAAWf,GAClB,OAAOxa,OAAOC,KAAKua,GAChBlR,OACApJ,QAAO,SAAU8J,EAAKwR,GAErB,OADAxR,EAAIwR,GAAQhB,EAAIgB,GACTxR,CACT,GAAG,CAAC,EACR,CAEA,IAAI2I,EAAiB,CASnBqB,YAAa,SAAoBlW,EAAOsN,GACtC,IAAI2I,EAAU,GAoGd,OAjGAA,EAAQvX,KAAK,CACXiZ,UAAW3X,EACX2D,OAAQkR,EAAegB,qBAAqBvI,KAI9CA,EAAMjC,8BAA8B5G,SAAQ,SAAUkN,GACpDsE,EAAQvX,KAAK,CACXiZ,UAAW3X,EACX2D,OAAQkR,EAAe8I,iCACrBrQ,EACAqE,IAGN,IAGArE,EAAM/B,+BAA+B9G,SAAQ,SAAUkN,GACrD,IAAI7I,EAAoBwE,EAAMjD,2BAA2BsH,GACrD7L,EAAoBwH,EAAMvH,0BAA0B4L,GACpDxH,EAAYmD,EAAMlD,+BAA+BtB,GAIrD,GACEhD,EAAkBjI,OAAS,GAC3BiI,EAAkB,GAAGkH,MAAM7C,GAAWtM,OAAS,EAC/C,CAEA,IAAI+f,EAAa9X,EAAkB,GAChCkH,MAAM7C,GACN/L,MAAM,GAAI,GACVgE,QAAO,SAA0BgD,EAAKyY,EAASxP,GAC9C,OAAOjJ,EAAI5D,OAAO,CAChBL,UAAW2H,EAAkB8G,WAAWvB,GACxCjN,MACY,IAAViN,EACIwP,EACA,CAACzY,EAAIA,EAAIvH,OAAS,GAAGuD,MAAOyc,GAASC,KAAK3T,IAEpD,GAAG,IAELyT,EAAWnZ,SAAQ,SAAUjC,EAAQ6L,GACnC,IAAI1K,EAASkR,EAAe8I,iCAC1BrQ,EACA9K,EAAOrB,UACG,IAAVkN,GAIF,SAAS0P,EAA2B3c,GAClC,OAAO0H,EAAkB8G,WAAWoO,MAAK,SAAU7c,GACjD,OAAOA,IAAcC,EAAM4L,MAAM,KAAK,EACxC,GACF,CAEA,IAAIiR,GAAwBta,EAAO4W,cAAgB,IAAInY,QACrD,SAAU8J,EAAKgS,GACb,GAAI/f,MAAMoF,QAAQ2a,GAAc,CAC9B,IAAIC,EAAWD,EAAY1b,QAAO,SAAU4b,GAC1C,OAAQL,EAA2BK,EACrC,IAEID,EAAStgB,OAAS,GACpBqO,EAAIxN,KAAKyf,EAEb,CASA,MANyB,kBAAhBD,GACNH,EAA2BG,IAE5BhS,EAAIxN,KAAKwf,GAGJhS,CACT,GACA,IAGEkC,EAASwP,EAAWvP,EAAQ,GAE9B1K,EAAO4W,aADLlM,EAAQ,EACY4P,EAAqBzc,OACzC4M,EAAOjN,UAAY,IAAMiN,EAAOhN,OAIhC6c,EAAqBpgB,OAAS,EAC1BogB,OACA1hB,EAGR0Z,EAAQvX,KAAK,CAAEiZ,UAAW3X,EAAO2D,OAAQA,GAC3C,GACF,CACF,IAEOsS,CACT,EAQAJ,qBAAsB,SAAUvI,GAC9B,IAAIvJ,EAASuJ,EAAMvJ,OAChBvC,OAAO8L,EAAMtJ,mBACbxC,OAAOqT,EAAewJ,qCAAqC/Q,IAC3D9B,OAEC+O,EAAe1F,EAAeyJ,iBAAiBhR,GAC/ChH,EAAiBuO,EAAe0J,mBAAmBjR,GACnDjH,EAAawO,EAAe2J,eAAelR,GAC3CmR,EAAmB,CACrB1a,OAAQA,EAAOlB,QAAQ,MAAQ,EAAI,CAAC,KAAOkB,EAC3CsC,WAAYA,GAWd,OARIkU,EAAa1c,OAAS,IACxB4gB,EAAiBlE,aAAeA,GAG9BjU,EAAezI,OAAS,IAC1B4gB,EAAiBnY,eAAiBA,GAG7BmX,EAAWza,EAAM,CAAC,EAAGsK,EAAM1B,iBAAkB6S,GACtD,EAUAd,iCAAkC,SAChCrQ,EACA1H,EACA8Y,GAEA,IAAInE,EAAe1F,EAAeyJ,iBAChChR,EACA1H,EACA8Y,GAEEpY,EAAiBuO,EAAe0J,mBAAmBjR,EAAO1H,GAC1DS,EAAawO,EAAe2J,eAAelR,GAC3CmR,EAAmB,CACrBnX,YAAa,EACbJ,KAAM,EACNyX,WAAW,EACXC,gBAAgB,GAGdvY,EAAWxI,OAAS,IACtB4gB,EAAiBpY,WAAaA,GAGhC,IAAIyC,EAAoBwE,EAAMjD,2BAA2BzE,GAqBzD,OAlBE6Y,EAAiB1a,OADf+E,EAEA+L,EAAegK,0CACbvR,EACAxE,EACA4V,GAGsB9Y,EAGxBU,EAAezI,OAAS,IAC1B4gB,EAAiBnY,eAAiBA,GAGhCiU,EAAa1c,OAAS,IACxB4gB,EAAiBlE,aAAeA,GAG3BkD,EAAWza,EAAM,CAAC,EAAGsK,EAAM1B,iBAAkB6S,GACtD,EASAF,mBAAoB,SAAUjR,EAAOzF,GACnC,GAAIyF,EAAMhH,eACR,OAAOgH,EAAMhH,eAGf,IAAIA,EAAiB,GAqBrB,OAnBApE,OAAOC,KAAKmL,EAAMjJ,oBAAoBI,SAAQ,SAAUtD,GACtD,IAAImE,EAAYgI,EAAMjJ,mBAAmBlD,IAAc,CAAC,EACxDe,OAAOC,KAAKmD,GAAWb,SAAQ,SAAUc,GACvC,IAAIjD,EAASgD,EAAUC,IAAa,GAChCsC,IAAc1G,GAChBmB,EAAOmC,SAAQ,SAAUrD,GACvB,GAAIjD,MAAMoF,QAAQnC,GAAQ,CACxB,IAAI0d,EAAK1d,EAAMgE,KAAI,SAAUxD,GAC3B,OAAOT,EAAYoE,EAAW3D,CAChC,IACA0E,EAAe5H,KAAKogB,EACtB,MACExY,EAAe5H,KAAKyC,EAAYoE,EAAWnE,EAE/C,GAEJ,GACF,IAEOkF,CACT,EAQAkY,eAAgB,SAAUlR,GACxB,OAAIA,EAAMjH,WACDiH,EAAMjH,WAGRiH,EAAMhJ,eAAewZ,KAAK,IACnC,EAWAQ,iBAAkB,SAAUhR,EAAO1H,EAAO8Y,GACxC,IAAInE,EAAe,GAEfrW,EAAoBoJ,EAAMpJ,mBAAqB,CAAC,EACpDhC,OAAOC,KAAK+B,GACTsH,OACA/G,SAAQ,SAAUoD,IACC3D,EAAkB2D,IAAc,IACtC2D,OAAO/G,SAAQ,SAAUgK,GACnC8L,EAAa7b,KAAKmJ,EAAY,IAAM4G,EACtC,GACF,IAEF,IAAItK,EAAiBmJ,EAAMnJ,gBAAkB,CAAC,EAC9CjC,OAAOC,KAAKgC,GACTqH,OACA/G,SAAQ,SAAUoD,IACC1D,EAAe0D,IAAc,IACnC2D,OAAO/G,SAAQ,SAAUgK,GACnC8L,EAAa7b,KAAKmJ,EAAY,KAAO4G,EACvC,GACF,IAEF,IAAIrK,EAA+BkJ,EAAMlJ,8BAAgC,CAAC,EAC1ElC,OAAOC,KAAKiC,GACToH,OACA/G,SAAQ,SAAUoD,GACjB,IAAI4L,EAAcrP,EAA6ByD,IAAc,GAC7D,GAAIA,IAAcjC,GAAU6N,GAAsC,IAAvBA,EAAY5V,OAAvD,CAGA,IAAIkhB,EAAY,GAEhBtL,EAAYjI,OAAO/G,SAAQ,SAAUgK,GACnCsQ,EAAUrgB,KAAKmJ,EAAY,IAAM4G,EACnC,IAEA8L,EAAa7b,KAAKqgB,EAPlB,CAQF,IAEF,IAAIxa,EACF+I,EAAM/I,+BAAiC,CAAC,EAmD1C,OAlDArC,OAAOC,KAAKoC,GACTiH,OACA/G,SAAQ,SAAUoD,GACjB,IACI4G,GADclK,EAA8BsD,IAAc,IACjC,GAE7B,QAAmBtL,IAAfkS,EAAJ,CAIA,IAGIuQ,EACAC,EAJAnW,EAAoBwE,EAAMjD,2BAA2BxC,GACrDsC,EAAYmD,EAAMlD,+BAA+BtB,GACjDjD,EAAWyH,EAAMZ,yBAAyB5D,GAK9C,GAAIlD,IAAUiC,EAAW,CAGvB,IACqC,IAAnC4G,EAAW5L,QAAQsH,KACjBtE,IAAsC,IAA1B6Y,GACb7Y,GACCA,EAASmH,MAAM7C,GAAWtM,SACxB4Q,EAAWzB,MAAM7C,GAAWtM,OAEhC,OAGGgI,GAIHoZ,EAAkBpZ,EAASmH,MAAM7C,GAAWtM,OAAS,EACrD4Q,EAAa5I,IAJboZ,EAAkBxQ,EAAWzB,MAAM7C,GAAWtM,OAAS,EACvD4Q,EAAaA,EAAWrQ,MAAM,EAAGqQ,EAAWnE,YAAYH,KAM1D6U,EAAoBlW,EAAkB8G,WAAWqP,EACnD,MACEA,EAAkBxQ,EAAWzB,MAAM7C,GAAWtM,OAAS,EAEvDmhB,EAAoBlW,EAAkB8G,WAAWqP,GAG/CD,GACFzE,EAAa7b,KAAK,CAACsgB,EAAoB,IAAMvQ,GAtC/C,CAwCF,IAEK8L,CACT,EAEA8D,qCAAsC,SAAU/Q,GAG9C,OAAOA,EAAMrJ,mBAAmB7B,QAE9B,SACE8c,EACApW,GAEA,IAAIqW,EAAyB7R,EAAMvH,0BACjC+C,EAAkB9C,MAClB,GAGF,IAAKmZ,EAEH,OADAD,EAAcxgB,KAAKoK,EAAkB8G,WAAW,IACzCsP,EAGT,IAAI/U,EAAYmD,EAAMlD,+BAA+BtB,GACjDuF,EAAQ8Q,EAAuBnS,MAAM7C,GAAWtM,OAChDuhB,EAAgBtW,EAAkB8G,WAAWxR,MAAM,EAAGiQ,EAAQ,GAElE,OAAO6Q,EAAc1d,OAAO4d,EAC9B,GAvBQ,GA0BZ,EAEAP,0CAA2C,SACzCvR,EACAxE,EACAuW,GAEA,IAAIlV,EAAYmD,EAAMlD,+BAA+BtB,GACrD,IAAkB,IAAduW,EAAoB,CACtB,IAAIxZ,EAAWyH,EAAMZ,yBAAyB5D,GAC1C2I,EAAiB,EAKrB,OAHI5L,IACF4L,EAAiB5L,EAASmH,MAAM7C,GAAWtM,QAEtC,CAACiL,EAAkB8G,WAAW6B,GACvC,CAEA,IAKI6N,GAJFhS,EAAMvH,0BAA0B+C,EAAkB9C,MAAM,IAAM,IAIvBgH,MAAM7C,GAAWtM,OAAS,EACnE,OAAOiL,EAAkB8G,WAAWxR,MAAM,EAAGkhB,EAAc,EAC7D,EAEA7H,uBAAwB,SAAU5P,EAAWd,EAAOoQ,EAAc7J,GAChE,IAAIiS,EAA+BjS,EAAMtF,mBAAmBH,GACxDyF,EAAMrH,iBAAiB4B,GACvByF,EACAkS,EAAiC,CACnCC,WAAY1Y,EACZc,UAAWA,GAKb,MAH4B,kBAAjBsP,IACTqI,EAA+BrI,aAAeA,GAEzCsG,EACLza,EACE,CAAC,EACD6R,EAAegB,qBAAqB0J,GACpCC,GAGN,GAGF5iB,EAAOC,QAAUgY,kCCvbjBjY,EAAOC,QAAU,SAA0BgH,GACzC,OAAkB,OAAdA,GAGG,wBAAwB6b,KAAK7b,EACtC,kCCLAjH,EAAOC,QAAU,6CCOJ,IAAIyZ,EAAE,EAAQ,OAAwE,IAAItR,EAAE,oBAAoB9C,OAAOmkB,GAAGnkB,OAAOmkB,GAA1G,SAAWhjB,EAAEC,GAAG,OAAOD,IAAIC,IAAI,IAAID,GAAG,EAAEA,IAAI,EAAEC,IAAID,IAAIA,GAAGC,IAAIA,CAAC,EAAiDmZ,EAAEnG,EAAEgQ,SAAS9nB,EAAE8X,EAAEiQ,UAAUtpB,EAAEqZ,EAAEkQ,gBAAgBC,EAAEnQ,EAAEoQ,cACtM,SAASjN,EAAEpW,GAAG,IAAIC,EAAED,EAAEsjB,YAAYtjB,EAAEA,EAAEjC,MAAM,IAAI,IAAIwlB,EAAEtjB,IAAI,OAAO0B,EAAE3B,EAAEujB,EAAE,CAAC,MAAM/kB,GAAG,OAAM,CAAE,CAAC,CAA4B,IAAIglB,EAAE,qBAAqBC,QAAQ,qBAAqBA,OAAOC,UAAU,qBAAqBD,OAAOC,SAASC,cAAzI,SAAW3jB,EAAEC,GAAG,OAAOA,GAAG,EAD+F,SAAWD,EAAEC,GAAG,IAAIsjB,EAAEtjB,IAAIzB,EAAE4a,EAAE,CAACwK,KAAK,CAAC7lB,MAAMwlB,EAAED,YAAYrjB,KAAK0iB,EAAEnkB,EAAE,GAAGolB,KAAKhoB,EAAE4C,EAAE,GAAwJ,OAArJ5E,GAAE,WAAW+oB,EAAE5kB,MAAMwlB,EAAEZ,EAAEW,YAAYrjB,EAAEmW,EAAEuM,IAAI/mB,EAAE,CAACgoB,KAAKjB,GAAG,GAAE,CAAC3iB,EAAEujB,EAAEtjB,IAAI9E,GAAE,WAA6B,OAAlBib,EAAEuM,IAAI/mB,EAAE,CAACgoB,KAAKjB,IAAW3iB,GAAE,WAAWoW,EAAEuM,IAAI/mB,EAAE,CAACgoB,KAAKjB,GAAG,GAAE,GAAE,CAAC3iB,IAAIojB,EAAEG,GAAUA,CAAC,EAC5M/pB,EAAQqqB,0BAAqB,IAAS5Q,EAAE4Q,qBAAqB5Q,EAAE4Q,qBAAqBL,sCCPxUjqB,EAAOC,QAAU,EAAjB,iOCHF,SAASwF,EAAK8kB,EAAS9mB,EAAIJ,GACzB,IACIuQ,EADA4W,EAAOnnB,EAAKonB,aAAe,GAE/B,MAAO,KACL,IAAIC,EAAIC,EAAIC,EAAIC,EAChB,IAAIC,EACAznB,EAAKV,MAA6B,OAApB+nB,EAAKrnB,EAAK0nB,YAAiB,EAASL,EAAGppB,KAAK+B,MAC5DynB,EAAUnE,KAAKqE,OACjB,MAAMC,EAAUV,IAEhB,KADoBU,EAAQhqB,SAAWupB,EAAKvpB,QAAUgqB,EAAQ7J,MAAK,CAAC8J,EAAK9nB,IAAUonB,EAAKpnB,KAAW8nB,KAEjG,OAAOtX,EAGT,IAAIuX,EAIJ,GALAX,EAAOS,EAEH5nB,EAAKV,MAA6B,OAApBgoB,EAAKtnB,EAAK0nB,YAAiB,EAASJ,EAAGrpB,KAAK+B,MAC5D8nB,EAAaxE,KAAKqE,OACpBpX,EAASnQ,KAAMwnB,GACX5nB,EAAKV,MAA6B,OAApBioB,EAAKvnB,EAAK0nB,YAAiB,EAASH,EAAGtpB,KAAK+B,IAAQ,CACpE,MAAM+nB,EAAaC,KAAKC,MAA+B,KAAxB3E,KAAKqE,MAAQF,IAAkB,IACxDS,EAAgBF,KAAKC,MAAkC,KAA3B3E,KAAKqE,MAAQG,IAAqB,IAC9DK,EAAsBD,EAAgB,GACtCE,EAAM,CAAClH,EAAKmH,KAEhB,IADAnH,EAAMhG,OAAOgG,GACNA,EAAItjB,OAASyqB,GAClBnH,EAAM,IAAMA,EAEd,OAAOA,CAAG,EAEZviB,QAAQ2pB,KACN,YAAOF,EAAIF,EAAe,OAAOE,EAAIL,EAAY,QACjD,2FAGiBC,KAAKO,IACpB,EACAP,KAAKQ,IAAI,IAAM,IAAML,EAAqB,sBAEpC,MAARnoB,OAAe,EAASA,EAAKV,IAEjC,CAEA,OADgD,OAA/CkoB,EAAa,MAARxnB,OAAe,EAASA,EAAKyoB,WAA6BjB,EAAGvpB,KAAK+B,EAAMuQ,GACvEA,CAAM,CAEjB,CACA,SAASmY,EAAavnB,EAAOwnB,GAC3B,QAAc,IAAVxnB,EACF,MAAM,IAAIrD,MAAM,wBAAuB6qB,EAAM,KAAKA,IAAQ,KAE1D,OAAOxnB,CAEX,CACA,MACM,EAAW,CAACf,EAAIwoB,KACpB,IAAIC,EACJ,OAAO,YAAYrrB,GACjBsrB,aAAaD,GACbA,EAAYE,YAAW,IAAM3oB,EAAGhC,MAAMjC,KAAMqB,IAAOorB,EACrD,CAAC,ECzDGI,EAAuBjpB,GAAUA,EACjCkpB,EAAyBC,IAC7B,MAAMC,EAAQnB,KAAKO,IAAIW,EAAME,WAAaF,EAAMG,SAAU,GACpDC,EAAMtB,KAAKQ,IAAIU,EAAMK,SAAWL,EAAMG,SAAUH,EAAMja,MAAQ,GAC9DkU,EAAM,GACZ,IAAK,IAAI1lB,EAAI0rB,EAAO1rB,GAAK6rB,EAAK7rB,IAC5B0lB,EAAI1kB,KAAKhB,GAEX,OAAO0lB,CAAG,EAENqG,EAAqB,CAAC9jB,EAAUoQ,KACpC,MAAM2T,EAAU/jB,EAASgkB,cACzB,IAAKD,EACH,OAEF,MAAMnsB,EAAWqsB,IACf,MAAM,MAAEC,EAAK,OAAEC,GAAWF,EAC1B7T,EAAG,CAAE8T,MAAO5B,KAAKC,MAAM2B,GAAQC,OAAQ7B,KAAKC,MAAM4B,IAAU,EAG9D,GADAvsB,EAAQmsB,EAAQK,yBACc,qBAAnBC,eACT,MAAO,OAGT,MAAMC,EAAW,IAAID,gBAAgBE,IACnC,MAAMC,EAAQD,EAAQ,GACtB,GAAa,MAATC,OAAgB,EAASA,EAAMC,cAAe,CAChD,MAAMC,EAAMF,EAAMC,cAAc,GAChC,GAAIC,EAEF,YADA9sB,EAAQ,CAAEssB,MAAOQ,EAAIC,WAAYR,OAAQO,EAAIE,WAGjD,CACAhtB,EAAQmsB,EAAQK,wBAAwB,IAG1C,OADAE,EAASO,QAAQd,EAAS,CAAEW,IAAK,eAC1B,KACLJ,EAASQ,UAAUf,EAAQ,CAC5B,EAEGgB,EAA0B,CAC9BC,SAAS,GAgBLC,EAAqC,oBAAV9D,QAA+B,gBAAiBA,OAC3E+D,EAAuB,CAACllB,EAAUoQ,KACtC,MAAM2T,EAAU/jB,EAASgkB,cACzB,IAAKD,EACH,OAEF,IAAIoB,EAAS,EACb,MAAMC,EAAWH,EAAoB,KAAa,EAAE,GAAS,KAC3D7U,EAAG+U,GAAQ,EAAM,GAChBnlB,EAASwK,QAAQ6a,uBACdC,EAAiBC,GAAgB,KACrCJ,EAASpB,EAAQ/jB,EAASwK,QAAQgb,WAAa,aAAe,aAC9DJ,IACAhV,EAAG+U,EAAQI,EAAY,EAEnB3tB,EAAU0tB,GAAc,GACxBG,EAAaH,GAAc,GAIjC,OAHAG,IACA1B,EAAQ2B,iBAAiB,SAAU9tB,EAASmtB,GAC5ChB,EAAQ2B,iBAAiB,YAAaD,EAAYV,GAC3C,KACLhB,EAAQ4B,oBAAoB,SAAU/tB,GACtCmsB,EAAQ4B,oBAAoB,YAAaF,EAAW,CACrD,EA0BGG,EAAiB,CAAC7B,EAASS,EAAOxkB,KACtC,GAAa,MAATwkB,OAAgB,EAASA,EAAMC,cAAe,CAChD,MAAMC,EAAMF,EAAMC,cAAc,GAChC,GAAIC,EAAK,CAIP,OAHapC,KAAKC,MAChBmC,EAAI1kB,EAASwK,QAAQgb,WAAa,aAAe,aAGrD,CACF,CACA,OAAOlD,KAAKC,MACVwB,EAAQK,wBAAwBpkB,EAASwK,QAAQgb,WAAa,QAAU,UACzE,EAaGK,EAAgB,CAACV,GACrBW,cAAc,EACdC,YACC/lB,KACD,IAAI2hB,EAAIC,EACR,MAAMoE,EAAWb,EAASW,EAC6C,OAAtElE,EAAsC,OAAhCD,EAAK3hB,EAASgkB,oBAAyB,EAASrC,EAAGsE,WAA6BrE,EAAGrpB,KAAKopB,EAAI,CACjG,CAAC3hB,EAASwK,QAAQgb,WAAa,OAAS,OAAQQ,EAChDD,YACA,EAEJ,MAAMG,EACJ,WAAAtlB,CAAYtG,GACV7D,KAAK0vB,OAAS,GACd1vB,KAAKutB,cAAgB,KACrBvtB,KAAK8uB,aAAc,EACnB9uB,KAAK2vB,uBAAyB,KAC9B3vB,KAAK4vB,kBAAoB,GACzB5vB,KAAK6vB,cAAgC,IAAIC,IACzC9vB,KAAK+vB,4BAA8B,GACnC/vB,KAAKgwB,gBAAkB,KACvBhwB,KAAKiwB,kBAAoB,EACzBjwB,KAAKkwB,oBAAsC,IAAIJ,IAC/C9vB,KAAK6tB,SAA2B,MAC9B,IAAIsC,EAAM,KACV,MAAMC,EAAM,IACND,IAEiC,qBAAnBvC,eACTuC,EAAM,IAAIvC,gBAAgBE,IAC/BA,EAAQzlB,SAAS0lB,IACf/tB,KAAKqwB,gBAAgBtC,EAAM9N,OAAQ8N,EAAM,GACzC,IAGG,MAGX,MAAO,CACLuC,WAAY,KACV,IAAIpF,EACJ,OAAuB,OAAfA,EAAKkF,UAAiB,EAASlF,EAAGoF,YAAY,EAExDlC,QAAUnO,IACR,IAAIiL,EACJ,OAAuB,OAAfA,EAAKkF,UAAiB,EAASlF,EAAGkD,QAAQnO,EAAQ,CAAEgO,IAAK,cAAe,EAElFI,UAAYpO,IACV,IAAIiL,EACJ,OAAuB,OAAfA,EAAKkF,UAAiB,EAASlF,EAAGmD,UAAUpO,EAAO,EAGhE,EA7B+B,GA8BhCjgB,KAAK+sB,MAAQ,KACb/sB,KAAKuwB,WAAcC,IACjB1qB,OAAOgoB,QAAQ0C,GAAOnoB,SAAQ,EAAElF,EAAK6B,MACd,qBAAVA,UACFwrB,EAAMrtB,EAAI,IAErBnD,KAAK+T,QAAU,CACbwX,OAAO,EACPkF,cAAe,EACfvD,SAAU,EACVwD,aAAc,EACdC,WAAY,EACZC,mBAAoB,EACpBC,iBAAkB,EAClB9B,YAAY,EACZ+B,WAAYjE,EACZkE,eAAgBjE,EAChBR,SAAU,OAEV6C,iBACA6B,YAAa,CAAEvD,MAAO,EAAGC,OAAQ,GACjCuD,aAAc,EACdC,IAAK,EACLC,eAAgB,aAChBC,yBAA0B,GAC1BC,MAAO,EACPzC,sBAAuB,OACpB4B,EACJ,EAEHxwB,KAAKsxB,OAAS,CAACC,EAAOC,KACpB,IAAItG,EAAIC,EACR,MAAM,WAAE8B,EAAU,SAAEG,GAAaptB,KAAK+sB,OAAS,CAC7CE,gBAAY,EACZG,cAAU,GAENL,EAAQ/sB,KAAKyxB,kBACfF,GAAStE,KAAyB,MAATF,OAAgB,EAASA,EAAME,aAAeG,KAAuB,MAATL,OAAgB,EAASA,EAAMK,aAC/E,OAAtCjC,GAAMD,EAAKlrB,KAAK+T,SAASuY,WAA6BnB,EAAGrpB,KAAKopB,EAAIlrB,KAAMwxB,GAC3E,EAEFxxB,KAAK0xB,QAAU,KACb1xB,KAAK0vB,OAAOtpB,OAAOG,SAAS8B,SAASmiB,GAAMA,MAC3CxqB,KAAK0vB,OAAS,GACd1vB,KAAKutB,cAAgB,IAAI,EAE3BvtB,KAAK2xB,UAAY,KACf3xB,KAAKkwB,oBAAoB7nB,QAAQrI,KAAK6tB,SAASO,SACxC,KACLpuB,KAAK6tB,SAASyC,aACdtwB,KAAK0xB,SAAS,GAGlB1xB,KAAK4xB,YAAc,KACjB,MAAMrE,EAAgBvtB,KAAK+T,QAAQ8d,mBAC/B7xB,KAAKutB,gBAAkBA,IACzBvtB,KAAK0xB,UACL1xB,KAAKutB,cAAgBA,EACrBvtB,KAAK8xB,gBAAgB9xB,KAAK+xB,aAAc,CACtC1C,iBAAa,EACbC,cAAU,IAEZtvB,KAAK0vB,OAAOptB,KACVtC,KAAK+T,QAAQsZ,mBAAmBrtB,MAAOwtB,IACrCxtB,KAAKgyB,WAAaxE,EAClBxtB,KAAKsxB,QAAO,GAAO,EAAM,KAG7BtxB,KAAK0vB,OAAOptB,KACVtC,KAAK+T,QAAQ0a,qBAAqBzuB,MAAM,CAAC0uB,EAAQI,KAC/C9uB,KAAKiwB,kBAAoB,EACzBjwB,KAAKgwB,gBAAkBlB,EAAc9uB,KAAK+xB,aAAerD,EAAS,UAAY,WAAa,KAC3F1uB,KAAK+xB,aAAerD,EACpB,MAAMuD,EAAkBjyB,KAAK8uB,YAC7B9uB,KAAK8uB,YAAcA,EACnB9uB,KAAKsxB,OAAOW,IAAoBnD,EAAaA,EAAY,KAG/D,EAEF9uB,KAAKkyB,QAAU,IACNlyB,KAAKgyB,WAAWhyB,KAAK+T,QAAQgb,WAAa,QAAU,UAE7D/uB,KAAKmyB,sBAAwBlsB,GAC3B,IAAM,CACJjG,KAAK+T,QAAQjB,MACb9S,KAAK+T,QAAQ2c,aACb1wB,KAAK+T,QAAQkd,aACbjxB,KAAK+T,QAAQ+c,cAEf,CAAChe,EAAO4d,EAAcO,EAAcH,KAClC9wB,KAAK+vB,4BAA8B,GAC5B,CACLjd,QACA4d,eACAO,eACAH,gBAGJ,CACE3tB,KAAK,IAGTnD,KAAKoyB,uBAAyB,CAACC,EAAczuB,KAC3C,MAAM0uB,EAA4C,IAAIxC,IAChDyC,EAAuC,IAAIzC,IACjD,IAAK,IAAI1tB,EAAIwB,EAAQ,EAAGxB,GAAK,EAAGA,IAAK,CACnC,MAAMowB,EAAcH,EAAajwB,GACjC,GAAIkwB,EAA0BvO,IAAIyO,EAAYC,MAC5C,SAEF,MAAMC,EAA8BH,EAAqBnC,IACvDoC,EAAYC,MAOd,GALmC,MAA/BC,GAAuCF,EAAYrF,IAAMuF,EAA4BvF,IACvFoF,EAAqBI,IAAIH,EAAYC,KAAMD,GAClCA,EAAYrF,IAAMuF,EAA4BvF,KACvDmF,EAA0BK,IAAIH,EAAYC,MAAM,GAE9CH,EAA0BM,OAAS5yB,KAAK+T,QAAQsd,MAClD,KAEJ,CACA,OAAOkB,EAAqBK,OAAS5yB,KAAK+T,QAAQsd,MAAQtvB,MAAM8wB,KAAKN,EAAqBrsB,UAAUkJ,MAAK,CAACnI,EAAGC,IACvGD,EAAEkmB,MAAQjmB,EAAEimB,IACPlmB,EAAErD,MAAQsD,EAAEtD,MAEdqD,EAAEkmB,IAAMjmB,EAAEimB,MAChB,QAAK,CAAM,EAEhBntB,KAAK8yB,gBAAkB7sB,GACrB,IAAM,CAACjG,KAAKmyB,wBAAyBnyB,KAAK6vB,iBAC1C,EAAG/c,QAAO4d,eAAcO,eAAcH,cAAcjB,KAClD,MAAMxD,EAAMrsB,KAAK+vB,4BAA4BtuB,OAAS,EAAIoqB,KAAKQ,OAAOrsB,KAAK+vB,6BAA+B,EAC1G/vB,KAAK+vB,4BAA8B,GACnC,MAAMsC,EAAeryB,KAAK4vB,kBAAkB5tB,MAAM,EAAGqqB,GACrD,IAAK,IAAI/qB,EAAI+qB,EAAK/qB,EAAIwR,EAAOxR,IAAK,CAChC,MAAM6B,EAAM2tB,EAAWxvB,GACjByxB,EAA6C,IAAvB/yB,KAAK+T,QAAQsd,MAAcgB,EAAa/wB,EAAI,GAAKtB,KAAKoyB,uBAAuBC,EAAc/wB,GACjH0rB,EAAQ+F,EAAsBA,EAAoB5F,IAAMntB,KAAK+T,QAAQmd,IAAMR,EAAeO,EAC1F+B,EAAenD,EAAcO,IAAIjtB,GACjCyvB,EAA+B,kBAAjBI,EAA4BA,EAAehzB,KAAK+T,QAAQkf,aAAa3xB,GACnF6rB,EAAMH,EAAQ4F,EACdH,EAAOM,EAAsBA,EAAoBN,KAAOnxB,EAAItB,KAAK+T,QAAQsd,MAC/EgB,EAAa/wB,GAAK,CAChBsC,MAAOtC,EACP0rB,QACA4F,OACAzF,MACAhqB,MACAsvB,OAEJ,CAEA,OADAzyB,KAAK4vB,kBAAoByC,EAClBA,CAAY,GAErB,CACElvB,KAAK,EACLooB,MAAO,IAAMvrB,KAAK+T,QAAQwX,QAG9BvrB,KAAKyxB,eAAiBxrB,GACpB,IAAM,CAACjG,KAAK8yB,kBAAmB9yB,KAAKkyB,UAAWlyB,KAAK+xB,gBACpD,CAACM,EAAca,EAAWnB,IACjB/xB,KAAK+sB,MAAQsF,EAAa5wB,OAAS,GAAKyxB,EAAY,EAuQnE,UAAwB,aACtBb,EAAY,UACZa,EAAS,aACTnB,IAEA,MAAMjf,EAAQuf,EAAa5wB,OAAS,EAC9B0xB,EAAavvB,GAAUyuB,EAAazuB,GAAOopB,MAC3CC,EAAamG,EAAwB,EAAGtgB,EAAOqgB,EAAWpB,GAChE,IAAI3E,EAAWH,EACf,KAAOG,EAAWta,GAASuf,EAAajF,GAAUD,IAAM4E,EAAemB,GACrE9F,IAEF,MAAO,CAAEH,aAAYG,WACvB,CApRuEqE,CAAe,CAC5EY,eACAa,YACAnB,iBACG,MAEP,CACE5uB,KAAK,EACLooB,MAAO,IAAMvrB,KAAK+T,QAAQwX,QAG9BvrB,KAAKqzB,WAAaptB,GAChB,IAAM,CACJjG,KAAK+T,QAAQgd,eACb/wB,KAAKyxB,iBACLzxB,KAAK+T,QAAQmZ,SACbltB,KAAK+T,QAAQjB,SAEf,CAACie,EAAgBhE,EAAOG,EAAUpa,IACf,OAAVia,EAAiB,GAAKgE,EAAe,CAC1C9D,WAAYF,EAAME,WAClBG,SAAUL,EAAMK,SAChBF,WACApa,WAGJ,CACE3P,KAAK,EACLooB,MAAO,IAAMvrB,KAAK+T,QAAQwX,QAG9BvrB,KAAKszB,iBAAoB7c,IACvB,MAAMO,EAAgBhX,KAAK+T,QAAQod,eAC7BoC,EAAW9c,EAAK+c,aAAaxc,GACnC,OAAKuc,EAMEpO,SAASoO,EAAU,KALxB/wB,QAAQkF,KACN,2BAA2BsP,oCAErB,EAEmB,EAE/BhX,KAAKqwB,gBAAkB,CAAC5Z,EAAMsX,KAC5B,MAAM3X,EAAOpW,KAAK4vB,kBAAkB5vB,KAAKszB,iBAAiB7c,IAC1D,IAAKL,IAASK,EAAKgd,YAOjB,YANAzzB,KAAKkwB,oBAAoB7nB,SAAQ,CAACqrB,EAAQvwB,KACpCuwB,IAAWjd,IACbzW,KAAK6tB,SAASQ,UAAU5X,GACxBzW,KAAKkwB,oBAAoByD,OAAOxwB,GAClC,IAIJ,MAAMywB,EAAW5zB,KAAKkwB,oBAAoBE,IAAIha,EAAKjT,KAC/CywB,IAAand,IACXmd,GACF5zB,KAAK6tB,SAASQ,UAAUuF,GAE1B5zB,KAAK6tB,SAASO,QAAQ3X,GACtBzW,KAAKkwB,oBAAoByC,IAAIvc,EAAKjT,IAAKsT,IAEzC,MAAMod,EAAmB7zB,KAAK+T,QAAQob,eAAe1Y,EAAMsX,EAAO/tB,MAClEA,KAAK8zB,WAAW1d,EAAMyd,EAAiB,EAEzC7zB,KAAK8zB,WAAa,CAAC1d,EAAMwc,KACvB,MACMmB,EAAQnB,GADG5yB,KAAK6vB,cAAcO,IAAIha,EAAKjT,MAAQiT,EAAKwc,MAE5C,IAAVmB,UACsD,IAApD/zB,KAAKg0B,2CAAwDh0B,KAAKg0B,2CAA2C5d,EAAM2d,EAAO/zB,MAAQoW,EAAK4W,MAAQhtB,KAAK+xB,aAAe/xB,KAAKiwB,oBAI1KjwB,KAAK8xB,gBAAgB9xB,KAAK+xB,aAAc,CACtC1C,YAAarvB,KAAKiwB,mBAAqB8D,EACvCzE,cAAU,IAGdtvB,KAAK+vB,4BAA4BztB,KAAK8T,EAAKxS,OAC3C5D,KAAK6vB,cAAgB,IAAIC,IAAI9vB,KAAK6vB,cAAc8C,IAAIvc,EAAKjT,IAAKyvB,IAC9D5yB,KAAKsxB,QAAO,GAAM,GACpB,EAEFtxB,KAAKmvB,eAAkB1Y,IAChBA,GAGLzW,KAAKqwB,gBAAgB5Z,OAAM,EAAO,EAEpCzW,KAAKi0B,gBAAkBhuB,GACrB,IAAM,CAACjG,KAAKqzB,aAAcrzB,KAAK8yB,qBAC/B,CAACoB,EAAS7B,KACR,MAAM8B,EAAe,GACrB,IAAK,IAAIvrB,EAAI,EAAGxH,EAAM8yB,EAAQzyB,OAAQmH,EAAIxH,EAAKwH,IAAK,CAClD,MACM4pB,EAAcH,EADV6B,EAAQtrB,IAElBurB,EAAa7xB,KAAKkwB,EACpB,CACA,OAAO2B,CAAY,GAErB,CACEhxB,KAAK,EACLooB,MAAO,IAAMvrB,KAAK+T,QAAQwX,QAG9BvrB,KAAKo0B,wBAA2B1F,IAC9B,MAAM2D,EAAeryB,KAAK8yB,kBAC1B,OAAOvG,EACL8F,EAAae,EACX,EACAf,EAAa5wB,OAAS,GACrBmC,GAAU2oB,EAAa8F,EAAazuB,IAAQopB,OAC7C0B,IAEH,EAEH1uB,KAAKq0B,sBAAwB,CAAC9E,EAAU+E,KACtC,MAAM1B,EAAO5yB,KAAKkyB,UACJ,SAAVoC,IAEAA,EADE/E,GAAYvvB,KAAK+xB,aACX,QACCxC,GAAYvvB,KAAK+xB,aAAea,EACjC,MAEA,SAGE,UAAV0B,IAEiB,QAAVA,EACT/E,GAAsBqD,EACH,WAAV0B,IACT/E,GAAsBqD,EAAO,IAE/B,MAAM2B,EAAiBv0B,KAAK+T,QAAQgb,WAAa,cAAgB,eAE3DyF,GADax0B,KAAKutB,cAAgB,aAAcvtB,KAAKutB,cAAgBvtB,KAAKutB,cAAc5C,SAAS8J,gBAAgBF,GAAkBv0B,KAAKutB,cAAcgH,GAAkB,GAC/Iv0B,KAAKkyB,UACpC,OAAOrG,KAAKO,IAAIP,KAAKQ,IAAImI,EAAWjF,GAAW,EAAE,EAEnDvvB,KAAK00B,kBAAoB,CAAC9wB,EAAO0wB,EAAQ,UACvC1wB,EAAQioB,KAAKO,IAAI,EAAGP,KAAKQ,IAAIzoB,EAAO5D,KAAK+T,QAAQjB,MAAQ,IACzD,MAAM0f,EAAcjG,EAAavsB,KAAK8yB,kBAAkBlvB,IACxD,GAAc,SAAV0wB,EACF,GAAI9B,EAAYrF,KAAOntB,KAAK+xB,aAAe/xB,KAAKkyB,UAAYlyB,KAAK+T,QAAQ8c,iBACvEyD,EAAQ,UACH,MAAI9B,EAAYxF,OAAShtB,KAAK+xB,aAAe/xB,KAAK+T,QAAQ6c,oBAG/D,MAAO,CAAC5wB,KAAK+xB,aAAcuC,GAF3BA,EAAQ,OAGV,CAEF,MAAM/E,EAAqB,QAAV+E,EAAkB9B,EAAYrF,IAAMntB,KAAK+T,QAAQ8c,iBAAmB2B,EAAYxF,MAAQhtB,KAAK+T,QAAQ6c,mBACtH,MAAO,CAAC5wB,KAAKq0B,sBAAsB9E,EAAU+E,GAAQA,EAAM,EAE7Dt0B,KAAK20B,cAAgB,IAAM30B,KAAKkwB,oBAAoB0C,KAAO,EAC3D5yB,KAAK40B,oBAAsB,KACW,OAAhC50B,KAAK2vB,yBACPhD,aAAa3sB,KAAK2vB,wBAClB3vB,KAAK2vB,uBAAyB,KAChC,EAEF3vB,KAAK60B,eAAiB,CAACtF,GAAY+E,QAAQ,QAAShF,YAAa,CAAC,KAChEtvB,KAAK40B,sBACY,WAAbtF,GAAyBtvB,KAAK20B,iBAChCnyB,QAAQkF,KACN,0EAGJ1H,KAAK8xB,gBAAgB9xB,KAAKq0B,sBAAsB9E,EAAU+E,GAAQ,CAChEjF,iBAAa,EACbC,YACA,EAEJtvB,KAAK80B,cAAgB,CAAClxB,GAAS0wB,MAAOS,EAAe,OAAQzF,YAAa,CAAC,KACzE1rB,EAAQioB,KAAKO,IAAI,EAAGP,KAAKQ,IAAIzoB,EAAO5D,KAAK+T,QAAQjB,MAAQ,IACzD9S,KAAK40B,sBACY,WAAbtF,GAAyBtvB,KAAK20B,iBAChCnyB,QAAQkF,KACN,0EAGJ,MAAO6nB,EAAU+E,GAASt0B,KAAK00B,kBAAkB9wB,EAAOmxB,GACxD/0B,KAAK8xB,gBAAgBvC,EAAU,CAAEF,iBAAa,EAAQC,aACrC,WAAbA,GAAyBtvB,KAAK20B,kBAChC30B,KAAK2vB,uBAAyB/C,YAAW,KACvC5sB,KAAK2vB,uBAAyB,KAI9B,GAHqB3vB,KAAKkwB,oBAAoBnM,IAC5C/jB,KAAK+T,QAAQ+c,WAAWltB,IAER,CAChB,MAAOoxB,GAAah1B,KAAK00B,kBAAkB9wB,EAAO0wB,GDtezCrtB,ECueQ+tB,EDveL9tB,ECuegBlH,KAAK+xB,aDveflG,KAAKoJ,IAAIhuB,EAAIC,GAAK,GCwelClH,KAAK80B,cAAclxB,EAAO,CAAE0wB,QAAOhF,YAEvC,MACEtvB,KAAK80B,cAAclxB,EAAO,CAAE0wB,QAAOhF,aD3e3B,IAACroB,EAAGC,CC4ed,IAEJ,EAEFlH,KAAKk1B,SAAW,CAACnB,GAASzE,YAAa,CAAC,KACtCtvB,KAAK40B,sBACY,WAAbtF,GAAyBtvB,KAAK20B,iBAChCnyB,QAAQkF,KACN,0EAGJ1H,KAAK8xB,gBAAgB9xB,KAAK+xB,aAAegC,EAAO,CAC9C1E,iBAAa,EACbC,YACA,EAEJtvB,KAAKm1B,aAAe,KAClB,IAAIjK,EACJ,MAAMmH,EAAeryB,KAAK8yB,kBAC1B,IAAI3F,EAQJ,OANEA,EAD0B,IAAxBkF,EAAa5wB,OACTzB,KAAK+T,QAAQ2c,aAEU,IAAvB1wB,KAAK+T,QAAQsd,OAA+D,OAA/CnG,EAAKmH,EAAaA,EAAa5wB,OAAS,SAAc,EAASypB,EAAGiC,MAAQ,EAAItB,KAAKO,OACjHiG,EAAarwB,OAAOhC,KAAK+T,QAAQsd,OAAOroB,KAAK5G,GAAMA,EAAE+qB,OAGrDA,EAAMntB,KAAK+T,QAAQkd,aAAejxB,KAAK+T,QAAQ4c,UAAU,EAElE3wB,KAAK8xB,gBAAkB,CAACpD,GACtBW,cACAC,eAEAtvB,KAAK+T,QAAQqhB,WAAW1G,EAAQ,CAAEY,WAAUD,eAAervB,KAAK,EAElEA,KAAKq1B,QAAU,KACb,IAAInK,EAAIC,EACRnrB,KAAK6vB,cAAgC,IAAIC,IACF,OAAtC3E,GAAMD,EAAKlrB,KAAK+T,SAASuY,WAA6BnB,EAAGrpB,KAAKopB,EAAIlrB,MAAM,EAAM,EAEjFA,KAAKuwB,WAAW1sB,GAChB7D,KAAKgyB,WAAahyB,KAAK+T,QAAQid,YAC/BhxB,KAAK+xB,aAAqD,oBAA/B/xB,KAAK+T,QAAQ0c,cAA+BzwB,KAAK+T,QAAQ0c,gBAAkBzwB,KAAK+T,QAAQ0c,cACnHzwB,KAAK4vB,kBAAoB5vB,KAAK+T,QAAQqd,yBACtCpxB,KAAK4vB,kBAAkBvnB,SAAS+N,IAC9BpW,KAAK6vB,cAAc8C,IAAIvc,EAAKjT,IAAKiT,EAAKwc,KAAK,IAE7C5yB,KAAKsxB,QAAO,GAAO,EACrB,EAEF,MAAM8B,EAA0B,CAACkC,EAAKC,EAAMC,EAAiBxwB,KAC3D,KAAOswB,GAAOC,GAAM,CAClB,MAAME,GAAUH,EAAMC,GAAQ,EAAI,EAC5BvmB,EAAewmB,EAAgBC,GACrC,GAAIzmB,EAAehK,EACjBswB,EAAMG,EAAS,MACV,MAAIzmB,EAAehK,GAGxB,OAAOywB,EAFPF,EAAOE,EAAS,CAGlB,CACF,CACA,OAAIH,EAAM,EACDA,EAAM,EAEN,CACT,EC9lBF,MAAMI,EAAgD,qBAAb/K,SAA2B,kBAAwB,YAC5F,SAASgL,EAAmB5hB,GAC1B,MAAM6hB,EAAW,cAAiB,KAAM,CAAG,IAAG,CAAC,GAAG,GAC5CC,EAAkB,IACnB9hB,EACHuY,SAAU,CAACwJ,EAAWtE,KACpB,IAAItG,EACAsG,GACF,IAAAuE,WAAUH,GAEVA,IAEyB,OAA1B1K,EAAKnX,EAAQuY,WAA6BpB,EAAGppB,KAAKiS,EAAS+hB,EAAWtE,EAAK,IAGzEjoB,GAAY,YACjB,IAAM,IAAIkmB,EAAYoG,KASxB,OAPAtsB,EAASgnB,WAAWsF,GACpB,aAAgB,IACPtsB,EAASooB,aACf,IACH+D,GAA0B,IACjBnsB,EAASqoB,gBAEXroB,CACT,kKC9BoI,SAAS,EAAE8W,GAAG,IAAIxf,GAAE,YAAE,CAACmE,MAAM,GAAGgxB,eAAe,KAAKC,aAAa,OAAO,OAAO,OAAE5V,EAAE6V,QAAQ,QAAOhc,IAAI,IAAIxM,EAAEwM,EAAE+F,OAAOvS,aAAayoB,mBAAmBt1B,EAAEq1B,QAAQ,CAAClxB,MAAM0I,EAAE1I,MAAMgxB,eAAetoB,EAAEsoB,eAAeC,aAAavoB,EAAEuoB,cAAa,KAAI,QAAE,KAAK,IAAI/b,EAAEmG,EAAE6V,QAAQ,GAAGvL,SAASyL,gBAAgBlc,GAAGA,aAAaic,kBAAkBjc,EAAEuZ,YAAY,CAAC,GAAGvZ,EAAEmc,MAAM,CAACC,eAAc,IAAKpc,EAAElV,QAAQnE,EAAEq1B,QAAQlxB,MAAMkV,EAAEqc,kBAAkBrc,EAAElV,MAAMvD,OAAOyY,EAAElV,MAAMvD,YAAY,CAAC,IAAIu0B,eAAetoB,EAAEuoB,aAAaxL,GAAG5pB,EAAEq1B,QAAY,OAAJxoB,GAAc,OAAJ+c,GAAUvQ,EAAEqc,kBAAkB7oB,EAAE+c,EAAE,CAAC5pB,EAAEq1B,QAAQ,CAAClxB,MAAM,GAAGgxB,eAAe,KAAKC,aAAa,KAAK,IAAG,KCAztBxwB,ECA8qGnE,EAAvFoM,EAA9HwM,4PDA59F,KAAGzU,EAAgD,IAAG,CAAC,GAA9CA,EAAE+wB,KAAK,GAAG,OAAO/wB,EAAEA,EAAEgxB,MAAM,GAAG,QAAQhxB,cCAy6FixB,KAAIxc,EAAkDwc,IAAI,CAAC,GAAjDxc,EAAEyc,KAAK,GAAG,OAAOzc,EAAEA,EAAE0c,OAAO,GAAG,SAAS1c,GAAY2c,GAAG,CAAC3c,IAAIA,EAAEA,EAAE4c,OAAO,GAAG,SAAS5c,EAAEA,EAAE6c,MAAM,GAAG,QAAQ7c,GAAjD,CAAqD2c,IAAI,CAAC,GAAGG,KAAItpB,EAA2EspB,IAAI,CAAC,GAA1EtpB,EAAEupB,QAAQ,GAAG,UAAUvpB,EAAEA,EAAEwpB,MAAM,GAAG,QAAQxpB,EAAEA,EAAEypB,MAAM,GAAG,QAAQzpB,GAAY0pB,KAAI91B,EAAmT81B,IAAI,CAAC,GAAlT91B,EAAE+1B,aAAa,GAAG,eAAe/1B,EAAEA,EAAEg2B,cAAc,GAAG,gBAAgBh2B,EAAEA,EAAEi2B,WAAW,GAAG,aAAaj2B,EAAEA,EAAEk2B,eAAe,GAAG,iBAAiBl2B,EAAEA,EAAEm2B,iBAAiB,GAAG,mBAAmBn2B,EAAEA,EAAEo2B,qBAAqB,GAAG,uBAAuBp2B,EAAEA,EAAEq2B,2BAA2B,GAAG,6BAA6Br2B,GAAY,SAASs2B,GAAG9O,EAAEzL,EAAEnD,IAAGA,IAAG,IAAIA,EAAwB,OAAtB4O,EAAE+O,kBAAyB/O,EAAE/U,QAAQ+U,EAAE+O,mBAAmB,KAAKnqB,EAAE2P,EAAEyL,EAAE/U,QAAQ/R,SAAS4nB,EAAElc,EAAEjM,OAAO,GAAgC,OAA7BiM,EAAE,GAAGoqB,QAAQ5B,QAAQte,MAAalK,EAAE0B,MAAK,CAACob,EAAElpB,IAAIkpB,EAAEsN,QAAQ5B,QAAQte,MAAMtW,EAAEw2B,QAAQ5B,QAAQte,SAAO,SAAGlK,GAAE8c,GAAGA,EAAEsN,QAAQ5B,QAAQ6B,OAAO7B,UAASlY,EAAE9D,EAAE0P,EAAEnjB,QAAQyT,GAAG,KAAK,OAAY,IAAL8D,IAASA,EAAE,MAAM,CAACjK,QAAQ6V,EAAEiO,kBAAkB7Z,EAAE,CAAC,IAAIga,GAAG,CAAC,CAAC,CAAGlP,GAAG,IAAIzL,EAAE,OAA6B,OAAtBA,EAAEyL,EAAEgP,QAAQ5B,UAAgB7Y,EAAE4a,UAA4B,IAAlBnP,EAAEoP,cAAkBpP,EAAE,IAAIA,EAAE+O,kBAAkB,KAAKK,cAAc,EAAEC,kBAAkB,EAAEC,YAAW,EAAG,EAAE,CAAC,CAAGtP,GAAG,IAAIzL,EAAEnD,EAAE,GAA0B,OAAtBmD,EAAEyL,EAAEgP,QAAQ5B,UAAgB7Y,EAAE4a,UAA4B,IAAlBnP,EAAEoP,cAAkB,OAAOpP,EAAE,GAA0B,OAAtB5O,EAAE4O,EAAEgP,QAAQ5B,UAAgBhc,EAAElV,MAAM,CAAC,IAAI0I,EAAEob,EAAEgP,QAAQ5B,QAAQmC,eAAevP,EAAEgP,QAAQ5B,QAAQlxB,OAAO,IAAQ,IAAL0I,EAAO,MAAM,IAAIob,EAAE+O,kBAAkBnqB,EAAEwqB,cAAc,EAAEE,YAAW,EAAG,CAAC,MAAM,IAAItP,EAAEoP,cAAc,EAAEE,YAAW,EAAG,EAAE,CAAC,CAAGtP,EAAEzL,GAAG,IAAIW,EAAEwM,EAAElpB,EAAEc,EAAEvB,EAAE,GAA0B,OAAtBmd,EAAE8K,EAAEgP,QAAQ5B,UAAgBlY,EAAEia,UAAiC,OAAtBzN,EAAE1B,EAAEgP,QAAQ5B,UAAgB1L,EAAE8N,WAAWpC,UAAkC,OAAtB50B,EAAEwnB,EAAEgP,QAAQ5B,WAAgB50B,EAAEi3B,gBAAgBrC,QAAQsC,SAA2B,IAAlB1P,EAAEoP,cAAkB,OAAOpP,EAAE,GAAGA,EAAE2P,QAAQ,CAAC,IAAI1kB,QAAQsW,EAAE4N,SAASxyB,GAAGqjB,EAAE2P,QAAQC,EAAErb,EAAEgZ,QAAQ,KAAEsC,SAAStb,EAAE3J,KAAI,QAAG2J,EAAE,CAACub,aAAa,IAAIvO,EAAEwO,mBAAmB,KAAK,IAAIpO,EAAEqO,EAAE,OAAiE,OAA1DA,EAA2B,OAAxBrO,EAAE3B,EAAE+O,mBAAyBpN,EAAEJ,EAAEhX,WAAU0lB,IAAItzB,EAAEszB,MAAWD,EAAE,MAAME,gBAAgBvzB,EAAE,SAAAwzB,GAAY,MAAM,IAAIt3B,MAAM,4BAA4B,IAAIu3B,EAAiB,OAAd92B,EAAEib,EAAE8b,SAAe/2B,EAAE,EAAE,OAAO0mB,EAAE+O,oBAAoBa,GAAG5P,EAAEqP,oBAAoBe,EAAEpQ,EAAE,IAAIA,EAAE+O,kBAAkBa,EAAEP,kBAAkBe,EAAEd,YAAW,EAAG,CAAC,IAAIle,EAAE0d,GAAG9O,GAAG,GAAyB,OAAtB5O,EAAE2d,kBAAyB,CAAC,IAAIxN,EAAEnQ,EAAEnG,QAAQV,WAAU5N,IAAIA,EAAEqyB,QAAQ5B,QAAQ+B,YAAe,IAAL5N,IAASnQ,EAAE2d,kBAAkBxN,EAAE,CAAC,IAAI3c,EAAE2P,EAAEgZ,QAAQ,KAAEsC,SAAStb,EAAE3J,KAAI,QAAG2J,EAAE,CAACub,aAAa,IAAI1e,EAAEnG,QAAQ8kB,mBAAmB,IAAI3e,EAAE2d,kBAAkBoB,UAAU5O,GAAGA,EAAE+O,GAAGJ,gBAAgB3O,GAAGA,EAAEyN,QAAQ5B,QAAQ+B,WAAWrO,EAAiB,OAAd/oB,EAAEwc,EAAE8b,SAAet4B,EAAE,EAAE,OAAOioB,EAAE+O,oBAAoBnqB,GAAGob,EAAEqP,oBAAoBvO,EAAEd,EAAE,IAAIA,KAAK5O,EAAE2d,kBAAkBnqB,EAAEyqB,kBAAkBvO,EAAEwO,YAAW,EAAG,EAAE,EAAI,CAACtP,EAAEzL,KAAK,IAAIW,EAAEwM,EAAElpB,EAAE,GAA0B,OAAtB0c,EAAE8K,EAAEgP,QAAQ5B,UAAgBlY,EAAEya,QAAQ,MAAM,IAAI3P,EAAE/U,QAAQ,IAAI+U,EAAE/U,QAAQsJ,EAAEgc,UAAU,IAAInf,EAAEmD,EAAEgc,QAAQ3rB,EAAEkqB,GAAG9O,GAAE1mB,IAAIA,EAAEE,KAAK4X,GAAG9X,KAA0B,OAAtB0mB,EAAE+O,mBAAiD,OAAtBrN,EAAE1B,EAAEgP,QAAQ5B,UAAgB1L,EAAE8O,WAAWjc,EAAEgc,QAAQvB,QAAQ5B,QAAQlxB,SAAS0I,EAAEmqB,kBAAkBnqB,EAAEqG,QAAQtN,QAAQyT,IAAI,IAAI0P,EAAE,IAAId,KAAKpb,EAAEyqB,kBAAkB,GAAG,OAA6B,OAAtB72B,EAAEwnB,EAAEgP,QAAQ5B,UAAgB50B,EAAE82B,iBAAsC,IAA1BtP,EAAEgP,QAAQ5B,QAAQlxB,QAAiB4kB,EAAEiO,kBAAkB,GAAGjO,GAAG,EAAI,CAACd,EAAEzL,KAAK,IAAI3P,EAAE,GAA0B,OAAtBA,EAAEob,EAAEgP,QAAQ5B,UAAgBxoB,EAAE+qB,QAAQ,MAAM,IAAI3P,EAAE/U,QAAQ+U,EAAE/U,QAAQ3N,QAAOwjB,GAAGA,EAAEwP,KAAK/b,EAAE+b,MAAK,IAAIlf,EAAE0d,GAAG9O,GAAEc,IAAI,IAAI5L,EAAE4L,EAAEvW,WAAUmX,GAAGA,EAAE4O,KAAK/b,EAAE+b,KAAI,OAAY,IAALpb,GAAQ4L,EAAE3mB,OAAO+a,EAAE,GAAG4L,KAAI,MAAM,IAAId,KAAK5O,EAAEie,kBAAkB,EAAC,EAAG,EAAI,CAACrP,EAAEzL,IAAIyL,EAAEqP,oBAAoB9a,EAAE8b,QAAQrQ,EAAE,IAAIA,EAAEqP,kBAAkB9a,EAAE8b,SAAS,EAAI,CAACrQ,EAAEzL,KAAK,IAAI3P,EAAEkc,EAAE,GAAe,OAAZd,EAAE2P,QAAe,MAAM,IAAI3P,EAAE2P,QAAQ,CAAC1kB,QAAQsJ,EAAEtJ,QAAQkkB,SAAyB,OAAfvqB,EAAE2P,EAAE4a,UAAgBvqB,EAAE,KAAI,IAAK,GAAGob,EAAE2P,QAAQ1kB,UAAUsJ,EAAEtJ,SAAS+U,EAAE2P,QAAQR,WAAW5a,EAAE4a,SAAS,OAAOnP,EAAE,IAAI5O,EAAE4O,EAAE+O,kBAAkB,GAAyB,OAAtB/O,EAAE+O,kBAAyB,CAAC,IAAI7Z,EAAEX,EAAEtJ,QAAQtN,QAAQqiB,EAAE2P,QAAQ1kB,QAAQ+U,EAAE+O,oBAA2B3d,GAAF,IAAL8D,EAASA,EAAI,IAAI,CAAC,MAAM,IAAI8K,EAAE+O,kBAAkB3d,EAAEue,QAAQ,CAAC1kB,QAAQsJ,EAAEtJ,QAAQkkB,SAAyB,OAAfrO,EAAEvM,EAAE4a,UAAgBrO,EAAE,KAAI,GAAG,GAAI2P,IAAG,mBAAG,MAA8C,SAASC,GAAG1Q,GAAG,IAAIzL,GAAE,gBAAGkc,IAAI,GAAO,OAAJlc,EAAS,CAAC,IAAInD,EAAE,IAAIvY,MAAM,IAAImnB,oDAAoD,MAAMnnB,MAAM83B,mBAAmB93B,MAAM83B,kBAAkBvf,EAAEsf,IAAItf,CAAC,CAAC,OAAOmD,CAAC,CAAhOkc,GAAGG,YAAY,yBAAkN,IAAIC,IAAG,mBAAG,MAAM,SAASC,GAAG9Q,GAAG,IAAIzL,EAAEwc,GAAE,oBAAoB9lB,QAAQmG,GAAGmD,EAAEob,SAAS/qB,EAAEkc,IAAG,cAAE,KAAK,IAAI/oB,EAAEwc,EAAEib,WAAWpC,QAAQ,IAAIr1B,EAAE,MAAM,CAAC,EAAE,GAAG,IAAIwpB,EAAEK,OAAOoP,iBAAiBj5B,GAAG,MAAM,CAACiI,WAAWuhB,EAAE0P,mBAAmB1P,EAAE2P,YAAYlxB,WAAWuhB,EAAE4P,iBAAiB5P,EAAE6P,eAAc,GAAG,CAAC7c,EAAEib,WAAWpC,UAAUlY,GH+B1iOjK,EG/B+iO,CAAC6c,mBAAmBljB,EAAEmjB,iBAAiBjH,EAAE9W,MAAMoH,EAAEzY,OAAO,YAAAwxB,GAAe,OAAO,EAAE,EAAE,gBAAApB,GAAmB,IAAIhxB,EAAE,OAAgC,OAAzBA,EAAEwc,EAAEib,WAAWpC,SAAer1B,EAAE,IAAI,EAAEqsB,SAAS,IHgC/tOyI,EAAmB,CACxBtI,mBAAkB,EAClBoB,qBAAoB,EACpB2G,WAAYhG,KACTrb,MGpCuuOyW,EAAElpB,IAAG,cAAG,GH+BtvO,IAAwByS,GG/BiuO,QAAE,KAAKzS,GAAET,GAAGA,EAAE,GAAC,GAAG,CAACqZ,IAAI,IAAI9X,EAAE4b,EAAEiW,kBAAkB,OAAkB,IAAX7xB,EAAEX,OAAW,KAAK,gBAAgBk4B,GAAGQ,SAAS,CAACn1B,MAAMgZ,GAAG,gBAAgB,MAAM,CAACoc,MAAM,CAACp3B,SAAS,WAAWyqB,MAAM,OAAOC,OAAO,GAAG1P,EAAEmX,oBAAoBkF,IAAIx5B,IAAI,GAAGA,EAAE,CAAC,GAAmB,oBAATy5B,cAAmD,IAA7BA,QAAQC,IAAIC,gBAA+C,IAAtBnd,EAAE8a,kBAAsB,OAA6B,OAAtB9a,EAAEwa,mBAA0B3d,EAAEzY,OAAO4b,EAAEwa,mBAAmB7Z,EAAE8W,cAAczX,EAAEwa,kBAAkB,IAAIz1B,EAAE4G,KAAInI,IAAI,IAAIwpB,EAAE,OAAO,gBAAgB,WAAG,CAAClnB,IAAItC,EAAEsC,KAAK,eAA+B,OAAfknB,EAAEvB,EAAEnS,eAAgB,EAAO0T,EAAEvoB,KAAKgnB,EAAE,CAAC2R,OAAOvgB,EAAErZ,EAAE+C,OAAO82B,KAAuB,IAAlBrd,EAAE6a,gBAAoB,CAAC/0B,IAAI,GAAGqnB,KAAK3pB,EAAEsC,MAAM,aAAatC,EAAE+C,MAAM,eAAesW,EAAEzY,OAAO,gBAAgBZ,EAAE+C,MAAM,EAAEw2B,MAAM,CAACp3B,SAAS,WAAW23B,IAAI,EAAEC,KAAK,EAAEC,UAAU,cAAch6B,EAAEmsB,WAAW8N,eAAe,UAAS,KAAK,CAAC,IAAIC,IAAG,mBAAG,MAA2C,SAASlB,GAAE/Q,GAAG,IAAIzL,GAAE,gBAAG0d,IAAI,GAAO,OAAJ1d,EAAS,CAAC,IAAInD,EAAE,IAAIvY,MAAM,IAAImnB,oDAAoD,MAAMnnB,MAAM83B,mBAAmB93B,MAAM83B,kBAAkBvf,EAAE2f,IAAG3f,CAAC,CAAC,OAAOmD,CAAC,CAAC,SAAS2d,GAAGlS,EAAEzL,GAAG,OAAO,QAAEA,EAAEpc,KAAK+2B,GAAGlP,EAAEzL,EAAE,CAApQ0d,GAAGrB,YAAY,sBAAsP,IAAIuB,GAAG,WAAskS,IAAaC,GAAG,MAAGC,eAAe,MAAGC,OAAi+G,IAAIC,IAAG,UAAhlZ,SAAYvS,EAAEzL,GAAG,IAAIie,EAAEC,EAAE,IAAIrhB,GAAE,UAAMlV,MAAM0I,EAAE8tB,aAAa5R,EAAE0C,SAAStO,EAAEyd,KAAKjR,EAAE5gB,KAAKtI,EAAEo6B,GAAGt5B,EAAE61B,SAASp3B,EAAEqZ,IAAG,EAAGyhB,QAAQtR,EAAE+N,WAAW3yB,GAAE,EAAGm2B,SAASlD,GAAE,EAAGmD,UAAU3C,GAAE,EAAGT,QAAQhO,EAAE,KAAKqR,SAAShD,KAAKC,GAAGjQ,EAAEiT,GAAE,OAAGnS,IAAIoS,GAAEtD,EAAE,QAAG,GAAOuD,IAAG,OAAGvuB,EAAEsQ,EAAE+d,IAAIG,EAAEC,IAAG,gBAAGnB,GAAG,CAAClD,SAAQ,iBAAKI,cAAczyB,EAAE,EAAE,EAAEsO,QAAQ,GAAG0kB,QAAQhO,EAAE,CAAC1W,QAAQ0W,EAAE1W,QAAQkkB,SAAyB,OAAfqD,EAAE7Q,EAAEwN,UAAgBqD,EAAE,KAAI,GAAI,KAAKzD,kBAAkB,KAAKM,kBAAkB,EAAEC,WAAW3yB,IAAI22B,GAAE,aAAE,GAAIC,GAAE,YAAE,CAAC7D,QAAO,EAAG8D,MAAK,IAAKC,GAAE,YAAE,MAAMC,GAAE,YAAE,MAAMC,GAAE,YAAE,MAAM55B,GAAE,OAAGT,GAAGs6B,GAAE,QAAEx1B,GAAGujB,EAAM,OAAJroB,EAASqoB,EAAE1W,QAAQtN,QAAQS,GAAGujB,EAAE1W,QAAQV,WAAU7N,GAAG3C,EAAE2C,EAAE0B,KAAIg1B,EAAEnoB,QAAQV,WAAU7N,GAAG3C,EAAE2C,EAAEsyB,QAAQ5B,QAAQlxB,MAAMkC,OAAKy1B,GAAE,kBAAGz1B,IAAG,QAAED,EAAE21B,KAAK,CAAC,EAAI,IAAIZ,EAAEpa,MAAKpc,GAAG3C,EAAE2C,EAAE0B,KAAI,EAAI,IAAIrE,EAAEm5B,EAAE90B,MAAK,CAAC80B,IAAIa,GAAE,QAAE31B,GAAGg1B,EAAErE,oBAAoB6E,EAAEx1B,KAAID,GAAE,cAAE,KAAI,IAAKi1B,EAAEL,UAAU3C,EAAEX,gBAAgB8D,EAAES,SAASP,EAAEQ,UAAUP,EAAElE,WAAWmE,EAAEz3B,MAAMg3B,EAAER,aAAaO,EAAE9D,SAASp3B,EAAE+7B,KAAKlE,EAAE,EAAE,EAAED,QAAQhO,EAAEyR,EAAEzD,QAAQ,KAAK,qBAAIZ,GAAoB,GAAGuE,EAAElG,SAA+B,OAAtBgG,EAAErE,oBAA2BpN,EAAEA,EAAE1W,QAAQtS,OAAO,EAAEy6B,EAAEnoB,QAAQtS,OAAO,GAAG,CAAC,GAAGgpB,EAAE,CAAC,IAAIjlB,EAAEilB,EAAE1W,QAAQV,WAAU2pB,IAAI,IAAIC,EAAGC,EAAG,QAAwD,OAA/CA,EAAoB,OAAhBD,EAAGxS,EAAEwN,eAAgB,EAAOgF,EAAGn7B,KAAK2oB,EAAEuS,KAAWE,EAAE,IAAI,IAAQ,IAAL13B,EAAO,OAAOA,CAAC,CAAC,IAAI0B,EAAEg1B,EAAEnoB,QAAQV,WAAU7N,IAAIA,EAAEsyB,QAAQ5B,QAAQ+B,WAAU,IAAQ,IAAL/wB,EAAO,OAAOA,CAAC,CAAC,OAAOg1B,EAAErE,iBAAiB,EAAEQ,eAAeqE,EAAES,QAAQt6B,EAAEy2B,WAAWqD,EAAES,SAASP,KAAI,CAACb,EAAED,EAAEl7B,EAAE63B,EAAEjzB,EAAEy2B,EAAEzR,KAAI,QAAE,KAAK,IAAIvjB,EAAEujB,GAAG0R,EAAE,CAACl7B,KAAK,EAAE8S,QAAQ0W,EAAE1W,QAAQkkB,SAAyB,OAAf/wB,EAAEujB,EAAEwN,UAAgB/wB,EAAE,MAAK,GAAG,CAACujB,EAAK,MAAHA,OAAQ,EAAOA,EAAE1W,QAAW,MAAH0W,OAAQ,EAAOA,EAAEwN,YAAW,QAAE,KAAKiE,EAAEpE,QAAQ5B,QAAQjvB,IAAG,CAACA,KAAI,OAAG,CAACA,EAAE81B,UAAU91B,EAAE61B,SAAS71B,EAAEqxB,aAAY,IAAIjY,EAAEgd,iBAAkC,IAAlBp2B,EAAEixB,eAAmB,IAAI9P,GAAE,cAAE,KAAK,IAAIlhB,EAAE1B,EAAEw3B,EAAE,MAAM,CAACtC,KAAuB,IAAlBzzB,EAAEixB,cAAkBD,SAASp3B,EAAEy8B,YAAYr2B,EAAE4wB,kBAAkB0F,aAAmC,OAAtBt2B,EAAE4wB,kBAAyB,KAAK5wB,EAAEwxB,QAAQxxB,EAAEwxB,QAAQ1kB,QAAiC,OAAxB7M,EAAED,EAAE4wB,mBAAyB3wB,EAAE,GAAgF,OAA5E81B,EAAsC,OAAnCx3B,EAAEyB,EAAE8M,QAAQ9M,EAAE4wB,yBAA0B,EAAOryB,EAAEsyB,QAAQ5B,QAAQlxB,OAAag4B,EAAE,KAAKh4B,MAAMg3B,EAAC,GAAG,CAAC/0B,EAAEpG,EAAEm7B,IAAIwB,GAAG,QAAE,KAAK,GAAyB,OAAtBv2B,EAAE4wB,kBAAyB,CAAC,GAAG5wB,EAAEwxB,QAAQ/c,EAAEzU,EAAEwxB,QAAQ1kB,QAAQ9M,EAAE4wB,wBAAwB,CAAC,IAAIC,QAAQ5wB,GAAGD,EAAE8M,QAAQ9M,EAAE4wB,mBAAmBnc,EAAExU,EAAEgvB,QAAQlxB,MAAM,CAACqb,EAAEod,WAAW,KAAE9E,SAAS1xB,EAAE4wB,kBAAkB,KAAI6F,GAAG,QAAE,KAAKvB,EAAE,CAACl7B,KAAK,IAAIm7B,EAAElG,SAAQ,CAAC,IAAIyH,GAAG,QAAE,KAAKxB,EAAE,CAACl7B,KAAK,IAAIm7B,EAAElG,SAAQ,EAAM,MAAH7L,GAASA,GAAE,IAAIuT,GAAG,QAAE,CAAC12B,EAAE1B,EAAEw3B,KAAKZ,EAAElG,SAAQ,EAAGhvB,IAAI,KAAEyxB,SAASwD,EAAE,CAACl7B,KAAK,EAAEo1B,MAAM,KAAEsC,SAASjlB,IAAIlO,EAAE2zB,QAAQ6D,IAAIb,EAAE,CAACl7B,KAAK,EAAEo1B,MAAMnvB,EAAEiyB,QAAQ6D,OAAMa,GAAG,QAAE,CAAC32B,EAAE1B,KAAK22B,EAAE,CAACl7B,KAAK,EAAEo4B,QAAQ,CAACD,GAAGlyB,EAAE4wB,QAAQtyB,KAAK,KAAKyB,EAAEm2B,SAAS53B,EAAE0wB,QAAQlxB,SAASo3B,EAAElG,SAAQ,GAAIiG,EAAE,CAACl7B,KAAK,EAAEm4B,GAAGlyB,GAAE,KAAKwU,GAAE,QAAExU,IAAG,QAAED,EAAE21B,KAAK,CAAC,CAAC,GAAK,OAAU,MAAHX,OAAQ,EAAOA,EAAE/0B,EAAE,EAAE,CAAC,GAAK,IAAI1B,EAAEyB,EAAEjC,MAAMhD,QAAQg7B,EAAEx3B,EAAE6N,WAAU4pB,GAAIp6B,EAAEo6B,EAAG/1B,KAAI,OAAY,IAAL81B,EAAOx3B,EAAElD,KAAK4E,GAAG1B,EAAEvC,OAAO+5B,EAAE,GAAM,MAAHf,OAAQ,EAAOA,EAAEz2B,EAAE,MAAKs4B,GAAG,QAAE52B,IAAIi1B,EAAE,CAACl7B,KAAK,EAAEk4B,QAAQjyB,GAAE,IAAImZ,GAAE,cAAE,KAAI,CAAEiM,SAAS5Q,EAAEqiB,eAAeF,EAAGJ,WAAWG,EAAGP,cAAcM,EAAGK,aAAaN,EAAGO,qBAAqBH,EAAGI,mBAAmBV,KAAK,KAAKW,GAAEC,KAAG,WAAKx1B,GAAM,OAAJyU,EAAS,CAAC,EAAE,CAACgd,IAAIhd,GAAGghB,IAAE,kBAAG,KAAK,QAAO,IAAJtC,EAAW,OAAU,MAAHE,OAAQ,EAAOA,EAAEF,EAAC,GAAG,CAACE,EAAEF,IAAI,OAAO,gBAAgBqC,GAAE,CAACp5B,MAAMm5B,GAAEG,MAAM,CAACC,QAAgC,OAAvBhD,EAAEt0B,EAAE61B,SAAS5G,cAAe,EAAOqF,EAAEnC,IAAIoF,KAAK,CAAC9D,KAAuB,IAAlBzzB,EAAEixB,cAAkBD,SAASp3B,IAAI,gBAAgB,KAAG,KAAK,gBAAgB04B,GAAGY,SAAS,CAACn1B,MAAMqb,GAAG,gBAAgB0a,GAAGZ,SAAS,CAACn1B,MAAMiC,GAAG,gBAAgB,KAAG,CAACjC,OAAM,QAAEiC,EAAEixB,cAAc,CAAC,EAAI,KAAGvB,KAAK,EAAI,KAAGC,UAAa,MAAHt1B,GAAS,gBAAgB,KAAG,CAAC22B,SAASp3B,EAAEqR,KAAQ,MAAH8pB,EAAQ,CAAC,CAAC16B,GAAG06B,GAAG,CAAC,EAAEP,KAAKjR,EAAEiU,QAAQJ,MAAI,SAAG,CAACK,SAAS91B,GAAE+1B,WAAW5F,EAAEyF,KAAKpW,EAAEwW,WAAW3D,GAAGrxB,KAAK,iBAAiB,IAA43Si1B,IAAG,UAA/oK,SAAY/V,EAAEzL,GAAG,IAAIgf,EAAE,IAAIniB,EAAE2f,GAAE,mBAAmBnsB,EAAE8rB,GAAG,mBAAmB5P,GAAE,OAAG1P,EAAE6iB,UAAU1f,GAAGW,GAAE,cAAMob,GAAG5O,EAAE,8BAA8BxM,IAAIia,SAAS32B,EAAE4Y,EAAE+d,WAAU,EAAG6G,UAAU18B,GAAE,KAAMvB,GAAGioB,EAAEuB,GAAE,SAAK5kB,EAAE,EAAGyU,EAAE4iB,UAAUpE,GAAE,QAAE6D,IAAI,OAAOA,EAAEp5B,KAAK,KAAK,KAAE47B,MAAM,KAAK,KAAEC,MAAM,OAAOzC,EAAE0C,iBAAiB1C,EAAE2C,kBAAoC,IAAlBhlB,EAAEge,eAAmBxqB,EAAEswB,eAAe3T,EAAE8U,WAAU,IAAI15B,MAAK,KAAK,KAAE25B,UAAU,OAAO7C,EAAE0C,iBAAiB1C,EAAE2C,kBAAoC,IAAlBhlB,EAAEge,gBAAoBxqB,EAAEswB,eAAe3T,EAAE8U,WAAU,KAAKjlB,EAAElV,OAAO0I,EAAE+vB,WAAW,KAAE4B,MAAK,KAAKhV,EAAE8U,WAAU,IAAI15B,MAAK,KAAK,KAAE65B,QAAQ,OAAO/C,EAAE0C,iBAAiB1C,EAAE2C,kBAAoC,IAAlBhlB,EAAEge,gBAAoBxqB,EAAEswB,eAAe3T,EAAE8U,WAAU,KAAKjlB,EAAElV,OAAO0I,EAAE+vB,WAAW,KAAE8B,KAAI,KAAKlV,EAAE8U,WAAU,IAAI15B,MAAK,KAAK,KAAE+5B,OAAO,OAAyB,IAAlBtlB,EAAEge,mBAAkB,GAAQqE,EAAE0C,iBAAiB/kB,EAAEoe,WAAWpC,UAAUhc,EAAEqe,gBAAgBrC,QAAQsC,QAAQ+D,EAAE2C,kBAAkBxxB,EAAE2vB,gBAAgBhT,EAAE8U,WAAU,IAAI15B,OAAM,QAAQ,OAAM,IAAIyzB,GAAE,QAAEqD,IAAIA,EAAE0C,mBAAkB,OAAG1C,EAAEkD,iBAAiBlD,EAAEmD,SAAS,GAAGlJ,OAAyB,IAAlBtc,EAAEge,cAAkBxqB,EAAE2vB,gBAAgB3vB,EAAEswB,gBAAgBv4B,IAAG,IAAIglB,GAAE,SAAG,CAACD,KAAKmV,eAAe7G,EAAE8G,WAAW7G,IAAG,OAAG,CAAC+F,UAAU18B,KAAKy9B,UAAU9D,EAAE+D,WAAW9D,IAAG,OAAG,CAAC+D,WAAWz+B,KAAK0+B,QAAQ/D,EAAEgE,WAAW/D,IAAG,OAAG,CAACjE,SAAS32B,IAAI66B,GAAE,cAAE,KAAI,CAAEzB,KAAuB,IAAlBxgB,EAAEge,cAAkBgI,OAAOjE,GAAqB,IAAlB/hB,EAAEge,cAAkBD,SAAS32B,EAAE0D,MAAMkV,EAAElV,MAAMm7B,MAAMpE,EAAE1F,MAAMyC,KAAI,CAAC5e,EAAE6hB,EAAEjD,EAAEmD,EAAE36B,IAAI86B,GAAE,SAAG,CAAC/B,IAAIzQ,EAAEwP,GAAG5O,EAAEvpB,MAAK,OAAG6nB,EAAE5O,EAAE6iB,WAAWqD,UAAU,EAAE,gBAAgB,UAAU,gBAA0C,OAAzB/D,EAAEniB,EAAEoe,WAAWpC,cAAe,EAAOmG,EAAEjD,GAAG,gBAAkC,IAAlBlf,EAAEge,cAAkB,kBAAkBzN,EAAEwN,SAAS32B,QAAG,EAAOw9B,UAAU18B,EAAEi+B,YAAYnH,EAAEoH,UAAU5H,GAAGK,EAAEiD,EAAEE,GAAG,OAAO,SAAG,CAACwC,SAAStC,EAAEuC,WAAW99B,EAAE29B,KAAKrC,EAAEyC,WAA3lD,SAAymDh1B,KAAK,mBAAmB,IAA6hH22B,IAAG,UAAx3S,SAAYzX,EAAEzL,GAAG,IAAIsgB,EAAGC,EAAGC,EAAGniB,EAAEoiB,EAAG,IAAI5jB,EAAE2f,GAAE,kBAAkBnsB,EAAE8rB,GAAG,kBAAkB5P,GAAE,aAAK5L,GAAE,UAAMob,GAAG5O,EAAExM,GAAG,6BAA6B4L,IAAI0C,SAAShrB,EAAEk/B,aAAap+B,EAAE61B,SAASp3B,EAAEqZ,EAAE+d,WAAU,EAAG6G,UAAUzU,GAAE,EAAGppB,KAAKwE,EAAE,UAAUizB,GAAG5P,EAAEoQ,GAAE,OAAGhf,EAAE4iB,SAASzf,GAAE,WAAMoN,GAAE,OAAGvQ,EAAE4iB,UAAUhE,GAAE,aAAE,GAAIC,GAAE,SAAKgD,GAAE,QAAE,KAAKruB,EAAE4e,SAAS,MAAMpS,EAAEoe,WAAWpC,UAAUhc,EAAEoe,WAAWpC,QAAQuK,UAAU,GAAG/yB,EAAE+vB,WAAW,KAAEiD,QAAO,IAAI1E,GAAE,cAAE,KAAK,IAAI3b,EAAE,MAAiB,mBAAHje,QAAyB,IAAV8X,EAAElV,MAA+B,OAAfqb,EAAEje,EAAE8X,EAAElV,QAAcqb,EAAE,GAAmB,iBAATnG,EAAElV,MAAgBkV,EAAElV,MAAM,KAAI,CAACkV,EAAElV,MAAM5C,KAAI,QAAG,EAAEie,EAAE8d,IAAIC,EAAEx1B,MAAM,GAAGkwB,EAAE5C,QAAQ,OAAO,IAAImI,EAAEnkB,EAAE4iB,SAAS5G,QAAQmI,KAAS,IAAJz1B,GAAW,IAAJu1B,GAAO9d,IAAI+d,KAAKC,EAAEr5B,MAAMqb,GAAGsgB,uBAAsB,KAAK,GAAG7H,EAAE5C,UAAUmI,IAAO,MAAH5T,OAAQ,EAAOA,EAAE2L,iBAAiBiI,EAAE,OAAO,IAAIrI,eAAesF,EAAErF,aAAasF,GAAG8C,EAA0C,IAAxCxS,KAAKoJ,KAAQ,MAAHsG,EAAQA,EAAE,IAAO,MAAHD,EAAQA,EAAE,KAAa,IAAJA,GAAO+C,EAAE9H,kBAAkB8H,EAAEr5B,MAAMvD,OAAO48B,EAAEr5B,MAAMvD,OAAM,IAAG,GAAG,CAACu6B,EAAE9hB,EAAEge,cAAczN,KAAI,QAAG,EAAEpK,IAAI8d,MAAM,GAAO,IAAJ9d,GAAW,IAAJ8d,EAAM,CAAC,GAAGrF,EAAE5C,QAAQ,OAAO,IAAIkI,EAAElkB,EAAE4iB,SAAS5G,QAAQ,IAAIkI,EAAE,OAAO,IAAIx1B,EAAEw1B,EAAEp5B,OAAOgxB,eAAeqI,EAAEpI,aAAaqF,EAAEsF,mBAAmBrF,GAAG6C,EAAEA,EAAEp5B,MAAM,GAAGo5B,EAAEp5B,MAAM4D,EAAM,OAAJ2yB,EAAS6C,EAAE7H,kBAAkB8H,EAAE/C,EAAEC,GAAG6C,EAAE7H,kBAAkB8H,EAAE/C,EAAE,IAAG,CAACphB,EAAEge,gBAAgB,IAAI+D,GAAE,aAAE,GAAIC,GAAE,QAAE,KAAKD,EAAE/F,SAAQ,CAAC,IAAIiG,GAAE,QAAE,KAAKpD,EAAEoG,WAAU,KAAKlD,EAAE/F,SAAQ,CAAC,GAAE,IAAIkG,ECArnZ,WAAa,IAAIliB,GAAE,SAAI,OAAO,QAAE4O,IAAI5O,EAAE2mB,UAAU3mB,EAAEilB,UAAUrW,EAAC,GAAG,CDAujZ,GAAKuT,GAAE,QAAEhc,IAAI,OAAOyY,EAAE5C,SAAQ,EAAGkG,GAAE,KAAKtD,EAAE5C,SAAQ,CAAC,IAAI7V,EAAEld,KAAK,KAAK,KAAE67B,MAAM,GAAGlG,EAAE5C,SAAQ,EAAqB,IAAlBhc,EAAEge,eAAmB+D,EAAE/F,QAAQ,OAAO,GAAG7V,EAAE4e,iBAAiB5e,EAAE6e,kBAAwC,OAAtBhlB,EAAE2d,kBAA4C,YAAlBnqB,EAAE2vB,gBAAuB3vB,EAAEwwB,qBAA8B,IAAThkB,EAAE0iB,MAAUlvB,EAAE2vB,gBAAgB,MAAM,KAAK,KAAE+B,UAAU,OAAOtG,EAAE5C,SAAQ,EAAG7V,EAAE4e,iBAAiB5e,EAAE6e,mBAAkB,QAAEhlB,EAAEge,cAAc,CAAC,EAAI,IAAIxqB,EAAE+vB,WAAW,KAAEqD,MAAM,EAAI,IAAIpzB,EAAEswB,iBAAiB,KAAK,KAAEsB,QAAQ,OAAOxG,EAAE5C,SAAQ,EAAG7V,EAAE4e,iBAAiB5e,EAAE6e,mBAAkB,QAAEhlB,EAAEge,cAAc,CAAC,EAAI,IAAIxqB,EAAE+vB,WAAW,KAAEsD,UAAU,EAAI,KAAKrzB,EAAEswB,eAAejF,EAAEoG,WAAU,KAAKjlB,EAAElV,OAAO0I,EAAE+vB,WAAW,KAAE8B,KAAI,GAAE,IAAK,KAAK,KAAEyB,KAAK,GAAG3gB,EAAE4gB,SAAS,MAAM,OAAOnI,EAAE5C,SAAQ,EAAG7V,EAAE4e,iBAAiB5e,EAAE6e,kBAAkBxxB,EAAE+vB,WAAW,KAAE4B,OAAO,KAAK,KAAE6B,OAAO,OAAOpI,EAAE5C,SAAQ,EAAG7V,EAAE4e,iBAAiB5e,EAAE6e,kBAAkBxxB,EAAE+vB,WAAW,KAAE4B,OAAO,KAAK,KAAE8B,IAAI,GAAG9gB,EAAE4gB,SAAS,MAAM,OAAOnI,EAAE5C,SAAQ,EAAG7V,EAAE4e,iBAAiB5e,EAAE6e,kBAAkBxxB,EAAE+vB,WAAW,KAAE8B,MAAM,KAAK,KAAE6B,SAAS,OAAOtI,EAAE5C,SAAQ,EAAG7V,EAAE4e,iBAAiB5e,EAAE6e,kBAAkBxxB,EAAE+vB,WAAW,KAAE8B,MAAM,KAAK,KAAEC,OAAO,OAAO1G,EAAE5C,SAAQ,EAAqB,IAAlBhc,EAAEge,mBAAkB,GAAQ7X,EAAE4e,iBAAiB/kB,EAAEoe,WAAWpC,UAAUhc,EAAEqe,gBAAgBrC,QAAQsC,QAAQnY,EAAE6e,kBAA2B,IAAThlB,EAAE0iB,MAAoB,OAAV1iB,EAAElV,OAAc+2B,IAAIruB,EAAE2vB,iBAAiB,KAAK,KAAEgE,IAAI,GAAGvI,EAAE5C,SAAQ,EAAqB,IAAlBhc,EAAEge,cAAkB,OAAgB,IAAThe,EAAE0iB,MAAgC,IAAtB1iB,EAAEie,mBAAuBzqB,EAAEwwB,qBAAqBxwB,EAAE2vB,gBAAqB,IAAId,GAAE,QAAElc,IAAO,MAAH/e,GAASA,EAAE+e,GAAY,IAATnG,EAAE0iB,MAA2B,KAAjBvc,EAAEJ,OAAOjb,OAAY+2B,IAAIruB,EAAEswB,cAAa,IAAIxB,GAAE,QAAEnc,IAAI,IAAI+d,EAAEx1B,EAAEy1B,EAAE,IAAIF,EAAuB,OAApBC,EAAE/d,EAAEihB,eAAqBlD,EAAE,IAAG13B,MAAK40B,GAAGA,IAAIjb,EAAEof,gBAAe,GAAG3G,EAAE5C,SAAQ,GAA+B,OAAzBttB,EAAEsR,EAAEoe,WAAWpC,WAAgBttB,EAAE24B,SAASpD,MAAgC,OAAxBE,EAAEnkB,EAAE6iB,UAAU7G,WAAgBmI,EAAEkD,SAASpD,KAAuB,IAAlBjkB,EAAEge,cAAkB,OAAO7X,EAAE4e,iBAA0B,IAAT/kB,EAAE0iB,MAAoB,OAAV1iB,EAAElV,OAAc+2B,IAAIruB,EAAE2vB,eAAc,IAAIZ,GAAE,QAAEpc,IAAI,IAAI+d,EAAEx1B,EAAEy1B,EAAE,IAAIF,EAAuB,OAApBC,EAAE/d,EAAEihB,eAAqBlD,EAAE,IAAG13B,MAAK40B,GAAGA,IAAIjb,EAAEof,gBAAwC,OAAxB72B,EAAEsR,EAAE6iB,UAAU7G,UAAgBttB,EAAE24B,SAASpD,IAA8B,OAAzBE,EAAEnkB,EAAEoe,WAAWpC,UAAgBmI,EAAEkD,SAASpD,IAAIjkB,EAAE+d,UAAU/d,EAAE2hB,WAA6B,IAAlB3hB,EAAEge,gBAAoBxqB,EAAEswB,eAAejF,EAAEoG,WAAU,KAAKzxB,EAAEuwB,qBAAqB,EAAC,IAAG,IAAIp7B,GAAE,WAAK65B,GAAE,YAAM8E,UAAU7E,EAAEiD,WAAW/C,IAAG,OAAG,CAACiC,UAAUzU,KAAKwV,UAAU54B,EAAE64B,WAAW1X,IAAG,OAAG,CAAC2X,WAAWl/B,IAAI28B,GAAG,cAAE,KAAI,CAAE9C,KAAuB,IAAlBxgB,EAAEge,cAAkBD,SAASp3B,EAAEs/B,MAAMl5B,EAAEovB,MAAMsG,EAAE8E,UAAUpX,KAAI,CAACnQ,EAAEjT,EAAE01B,EAAEtS,EAAExpB,IAAI68B,GAAG,SAAG,CAACrD,IAAInB,EAAEE,GAAG5O,EAAEkX,KAAK,WAAWzgC,KAAKwE,EAAE,gBAA2C,OAA1Bk4B,EAAGzjB,EAAEoe,WAAWpC,cAAe,EAAOyH,EAAGvE,GAAG,gBAAkC,IAAlBlf,EAAEge,cAAkB,wBAA8C,OAAtBhe,EAAE2d,uBAAyB,EAAO3d,EAAEue,QAAwI,OAA/HmF,EAAG1jB,EAAEnG,QAAQrN,MAAK2Z,IAAIA,EAAEyX,QAAQ5B,QAAQ+B,UAAU/d,EAAEijB,QAAQ9c,EAAEyX,QAAQ5B,QAAQlxB,MAAMkV,EAAEue,QAAQ1kB,QAAQmG,EAAE2d,4BAA4B,EAAO+F,EAAGxE,GAAwC,OAApCyE,EAAG3jB,EAAEnG,QAAQmG,EAAE2d,yBAA0B,EAAOgG,EAAGzE,GAAG,kBAAkBv2B,EAAE,mBAAmB65B,EAAE,oBAAoB,OAAOlB,aAA4G,OAA9FsC,EAAuB,OAAnBpiB,EAAEoN,EAAE0S,cAAoB9f,OAAmB,IAAjBxB,EAAEshB,aAAyB,MAAHp5B,OAAQ,EAAOA,EAAE8X,EAAEshB,cAAc,MAAYsC,EAAG5jB,EAAEshB,aAAavD,SAASp3B,QAAG,EAAOi+B,UAAUzU,EAAEsX,mBAAmBzF,EAAE0F,iBAAiBzF,EAAEmE,UAAUjE,EAAE/P,SAASiQ,EAAEsF,QAAQpF,EAAEqF,OAAOtF,GAAGK,EAAEzU,GAAG,OAAO,SAAG,CAACsW,SAAShB,EAAGiB,WAAWjG,EAAE8F,KAAKhB,EAAGoB,WAAlrI,QAAgsIh1B,KAAK,kBAAkB,IAA+qKm4B,GAAG,MAAGC,IAAG,UAAlgH,SAAYlZ,EAAEzL,GAAG,IAAIof,EAAE,IAAIviB,GAAE,cAAMkf,GAAG1rB,EAAE,+BAA+BwM,IAAIoiB,KAAK1S,GAAE,EAAGqY,OAAOjkB,EAAEkkB,OAAO1X,GAAE,EAAG2X,MAAM7gC,GAAE,KAAMc,GAAG0mB,EAAEjoB,EAAEg5B,GAAE,oBAAoBxP,EAAEmP,GAAG,oBAAoB/zB,GAAE,QAAGuY,GAAGvY,IAAI+kB,GAAE,GAAI,IAAIkO,EAAEQ,IAAG,QAAGzzB,GAAGglB,GAAE,UAAKqO,GAAE,OAAGj4B,EAAEy3B,WAAWjb,EAAE5X,EAAEizB,EAAE,MAAMK,GAAE,OAAGl4B,EAAEy3B,YAAYyD,GAAE,UAAKC,EAAW,OAAJD,GAAUA,EAAE,KAAGpF,QAAQ,KAAGA,KAAuB,IAAlB91B,EAAEq3B,eAAqB,OAAGr3B,EAAEi8B,SAASzS,EAAEgT,cAAcrB,IAAG,OAAGjD,GAAEl4B,EAAEu3B,aAAc92B,GAAqB,IAAlBT,EAAEq3B,iBAAmB,OAAG,CAACkK,SAAQ,QAAE,IAAI,CAACvhC,EAAEi8B,SAAS5G,QAAQr1B,EAAEk8B,UAAU7G,QAAQr1B,EAAEy3B,WAAWpC,aAAWr1B,EAAEu3B,aAAc92B,GAAqB,IAAlBT,EAAEq3B,iBAAmB,QAAE,KAAK,IAAIr1B,EAAEhC,EAAE03B,gBAAgBrC,QAAQsC,OAAqB,OAAb31B,EAAEimB,EAAE0P,SAAc31B,CAAG,GAAG,CAAChC,EAAE03B,gBAAgBzP,EAAE0P,UAAS,QAAE,KAAK33B,EAAE03B,gBAAgBrC,QAAQoG,KAAK1S,IAAG,CAAC/oB,EAAE03B,gBAAgB3O,KAAI,OAAG,CAACyY,UAAUxhC,EAAEy3B,WAAWpC,QAAQoM,QAA0B,IAAlBzhC,EAAEq3B,cAAkB,MAAAqK,CAAO1/B,GAAG,MAAgC,WAAzBA,EAAE2wB,aAAa,QAAmBgP,WAAWC,cAAc5/B,EAAE6/B,aAAa,QAAQF,WAAWG,YAAYH,WAAWI,aAAa,EAAE,IAAAC,CAAKhgC,GAAGA,EAAEigC,aAAa,OAAO,OAAO,IAAI,IAAI7G,GAAE,SAAG,CAA0B,OAAxBQ,EAAE57B,EAAEk8B,UAAU7G,cAAe,EAAOuG,EAAErD,KAAK8C,GAAE,cAAE,KAAI,CAAExB,KAAuB,IAAlB75B,EAAEq3B,cAAkBuC,YAAO,KAAS,CAAC55B,IAAIs7B,GAAE,QAAE,KAAK9R,EAAE4T,qBAAqB,EAAC,IAAI7B,GAAE,SAAG32B,EAAEglB,IAAI,CAAC,EAAE,CAAC,kBAAkBwR,EAAEyF,KAAK,UAAU,uBAAgC,IAAT7gC,EAAE+7B,WAAY,EAAOxD,GAAG1rB,EAAE2sB,IAAIvB,EAAEsB,MAAM,IAAIlB,EAAE,iBAAgB,OAAGr4B,EAAEi8B,UAAS,GAAIrP,MAAM,kBAAiB,OAAG5sB,EAAEk8B,WAAU,GAAItP,OAAOsV,QAAQ5G,IAAIt7B,EAAE43B,SAASuD,GAAGl2B,OAAO8iB,OAAOxmB,EAAE,CAACuU,SAAS,gBAAgBijB,GAAG,KAAKx3B,EAAEuU,YAAY,IAAI0lB,EAAEE,IAAG,cAAG17B,EAAEmE,OAAOnE,EAAEmE,QAAQq3B,GAAqB,IAAlBx7B,EAAEq3B,eAA4B,IAATr3B,EAAE+7B,MAAUL,EAAE17B,EAAEmE,OAAO,IAAIw3B,GAAE,QAAE35B,GAAGhC,EAAEs8B,QAAQd,EAAEx5B,KAAI,OAAO,gBAAgB,MAAG,CAACy/B,UAAQ9X,IAAE1B,EAAE0P,QAAQwD,IAAM,gBAAgBjB,GAAGZ,SAAS,CAACn1B,MAAe,IAATnE,EAAE+7B,KAAS/7B,EAAE,IAAIA,EAAEy4B,WAAWkD,KAAI,SAAG,CAACkC,SAAStC,EAAEuC,WAAWv8B,EAAEo8B,KAAKtC,EAAE0C,WAAppD,MAAkqDoE,SAAS9H,GAAG+H,QAAQjH,EAAEpyB,KAAK,sBAAsB,IAA01Ds5B,IAAG,UAA/0D,SAAYpa,EAAEzL,GAAG,IAAIxa,EAAE65B,EAAEC,EAAEE,EAAE,IAAI3iB,EAAE2f,GAAE,mBAAmBnsB,EAAE8rB,GAAG,mBAAmB5P,GAAE,cAAMwP,GAAGpb,EAAE,8BAA8B4L,IAAI5kB,MAAMwlB,EAAEyN,SAAS32B,EAA0E,OAAvEq7B,EAA6C,OAA1CD,EAAiB,OAAd75B,EAAEqX,EAAEue,cAAe,EAAO51B,EAAEo1B,eAAgB,EAAOyE,EAAE56B,KAAKe,EAAE2nB,KAAUmS,EAAK/kB,MAAMxV,EAAE,QAAQvB,GAAGioB,EAAEuB,EAAE,EAAGnQ,EAAE4iB,UAAUr3B,EAAEyU,EAAEue,QAAQve,EAAE2d,oBAAoB3d,EAAEme,eAAe7N,GAAyB,OAAtBtQ,EAAE2d,oBAAiE,OAAnCgF,EAAE3iB,EAAEnG,QAAQmG,EAAE2d,yBAA0B,EAAOgF,EAAEzD,MAAMpb,EAAE0a,EAAExe,EAAEof,WAAW9O,GAAG0O,GAAE,YAAE,MAAMzO,GAAE,OAAG,CAACwN,SAAS32B,EAAE0D,MAAMwlB,EAAEuN,OAAOmB,EAAEthB,MAAMxV,IAAI02B,GAAE,gBAAGa,IAAIZ,GAAE,OAAG1b,EAAE6b,EAAEJ,EAAEA,EAAE3J,eAAe,MAAM4M,GAAE,QAAE,IAAIruB,EAAE4e,SAAS9B,MAAI,QAAE,IAAI9c,EAAEqwB,eAAe/f,EAAEyM,IAAG,CAACA,EAAEzM,IAAI,IAAIge,GAAE,cAAI9hB,EAAEue,SAASve,EAAEke,cAAa,QAAE,KAAK,IAAIle,EAAEue,UAAUve,EAAEke,WAAW,OAAO,UAAKuI,uBAAsB,KAAK3E,EAAE9F,SAAQ,CAAC,GAAE,GAAG,CAAChc,EAAEue,QAAQve,EAAEke,cAAa,QAAE,KAAK,GAAG4D,EAAE9F,SAA2B,IAAlBhc,EAAEge,eAAmBzyB,GAAyB,IAAtByU,EAAEie,kBAAsB,OAAO,UAAKwI,uBAAsB,KAAK,IAAI15B,EAAEmhB,EAAmD,OAAhDA,EAAiB,OAAdnhB,EAAEiyB,EAAEhD,cAAe,EAAOjvB,EAAEk8B,iBAAuB/a,EAAEtmB,KAAKmF,EAAE,CAACm8B,MAAM,WAAU,GAAE,GAAG,CAAClK,EAAEzzB,EAAEyU,EAAEge,cAAche,EAAEie,kBAAkBje,EAAE2d,oBAAoB,IAAIoE,GAAE,QAAEh1B,IAAIA,EAAEg4B,iBAAiBh4B,EAAEy4B,SAAS,GAAGlJ,OAAOl1B,IAAIy6B,KAAI,YAAM4E,uBAAsB,IAAItW,MAAc,IAATnQ,EAAE0iB,MAAUlvB,EAAE2vB,iBAAgB,IAAInB,GAAE,QAAE,KAAK,GAAG56B,EAAE,OAAOoM,EAAE+vB,WAAW,KAAEiD,SAAS,IAAIz5B,EAAEiT,EAAEme,eAAe7N,GAAG9c,EAAE+vB,WAAW,KAAE9E,SAAS1xB,EAAC,IAAIk1B,GAAE,SAAKC,GAAE,QAAEn1B,GAAGk1B,EAAEkH,OAAOp8B,KAAIo1B,GAAE,QAAEp1B,IAAI,IAAIk1B,EAAEmH,SAASr8B,IAAI3F,GAAGmE,EAAE,OAAO,IAAI2iB,EAAElO,EAAEme,eAAe7N,GAAG9c,EAAE+vB,WAAW,KAAE9E,SAASvQ,EAAE,EAAC,IAAImU,GAAE,QAAEt1B,IAAIk1B,EAAEmH,SAASr8B,KAAK3F,GAAGmE,IAAIyU,EAAEqe,gBAAgBrC,QAAQoG,MAAM5uB,EAAE+vB,WAAW,KAAEiD,UAAS,IAAIlE,GAAE,cAAE,KAAI,CAAE0D,OAAOz6B,EAAE4wB,MAAM5wB,EAAE89B,SAAS7K,EAAET,SAAS32B,KAAI,CAACmE,EAAEizB,EAAEp3B,IAAI,OAAO,SAAG,CAACo9B,SAAS,CAACtF,GAAGpb,EAAEqc,IAAItB,EAAE2I,KAAK,SAAStB,UAAa,IAAJ9+B,OAAO,GAAQ,EAAE,iBAAoB,IAAJA,QAAU,EAAO,gBAAgBo3B,EAAET,cAAS,EAAOoI,YAAYpE,EAAE4F,QAAQ3F,EAAEsH,eAAepH,EAAEqH,aAAarH,EAAEsH,cAAcrH,EAAEsH,YAAYtH,EAAEuH,eAAerH,EAAEsH,aAAatH,GAAGoC,WAAW99B,EAAE29B,KAAKhC,EAAEoC,WAA7vD,MAA2wDh1B,KAAK,mBAAmB,IAAwDk6B,GAAGh+B,OAAO8iB,OAAOyS,GAAG,CAAC0I,MAAMxD,GAAGyD,OAAOnF,GAAGoF,MAAMlC,GAAGmC,QAAQlC,GAAGmC,OAAOjB,mOEAh+oB,IAAItZ,GAAE,mBAAE,MAAmC,SAASmS,IAAI,IAAI1e,GAAE,gBAAEuM,GAAG,GAAO,OAAJvM,EAAS,CAAC,IAAIgD,EAAE,IAAI1e,MAAM,2EAA2E,MAAMA,MAAM83B,mBAAmB93B,MAAM83B,kBAAkBpZ,EAAE0b,GAAG1b,CAAC,CAAC,OAAOhD,CAAC,CAAC,SAAS6e,EAAE7e,GAAG,IAAIpW,EAAEiT,EAAE4O,EAAE,IAAIzI,EAAqC,OAAlCnG,EAAY,OAATjT,GAAE,gBAAE2iB,SAAU,EAAO3iB,EAAEjC,OAAakV,OAAE,EAAO,OAAoC,OAA5B4O,EAAK,MAAHzL,OAAQ,EAAOA,EAAE5b,QAAcqnB,EAAE,GAAG,EAAE,CAACzI,KAAKhD,GAAGjX,OAAOG,SAASmb,KAAK,KAAKrB,CAAC,CAAC,SAASoc,GAAG2H,QAAQ/mB,GAAE,GAAI,CAAC,GAAG,IAAIgD,EAAE6b,KAAKj1B,EAAEiT,IAAG,cAAE,IAAI4O,EAAEzL,EAAE,CAACgD,KAAKpZ,GAAGb,OAAOG,SAASU,EAAE,MAAM,CAAC6hB,EAAErnB,OAAO,EAAEqnB,EAAEpH,KAAK,UAAK,GAAO,cAAE,IAAI,SAAShU,GAAG,IAAIsQ,GAAE,QAAE1c,IAAI4Y,GAAEmQ,GAAG,IAAIA,EAAE/oB,KAAI,IAAI4Y,GAAEmQ,IAAI,IAAII,EAAEJ,EAAEroB,QAAQwoB,EAAEC,EAAEhkB,QAAQnF,GAAG,OAAY,IAALkpB,GAAQC,EAAExnB,OAAOunB,EAAE,GAAGC,QAAMroB,GAAE,cAAE,KAAI,CAAEiiC,SAASrmB,EAAEwgB,KAAK9wB,EAAE8wB,KAAK50B,KAAK8D,EAAE9D,KAAK00B,MAAM5wB,EAAE4wB,MAAMt5B,MAAM0I,EAAE1I,SAAQ,CAACgZ,EAAEtQ,EAAE8wB,KAAK9wB,EAAE9D,KAAK8D,EAAE4wB,MAAM5wB,EAAE1I,QAAQ,OAAO,gBAAgB4kB,EAAEuQ,SAAS,CAACn1B,MAAM5C,GAAGsL,EAAEiJ,SAAS,GAAE,CAACuD,IAAI,CAAryB0P,EAAE8P,YAAY,eAAsyD,IAAI6B,GAAE,SAAtgC,SAAWle,EAAEgD,GAAG,IAAI4b,EAAE,IAAIh1B,GAAE,aAAIiT,EAAE6hB,IAAIjT,GAAE,SAAIjmB,GAAE,UAAKu2B,GAAG1rB,EAAE,oBAAoBzG,IAAIs3B,QAAQvgB,GAAK,MAAH8K,EAAQA,EAAe,OAAZmT,EAAE/hB,EAAEokB,YAAa,EAAOrC,EAAEsC,SAAQhQ,QAAQnsB,GAAE,KAAMd,GAAG+b,EAAEgN,GAAE,OAAEhK,IAAG,QAAE,IAAInG,EAAEmqB,SAAS32B,IAAG,CAACA,EAAEwM,EAAEmqB,WAAW,IAAI5Z,GAAE,QAAE6Z,IAAI,IAAIp9B,EAAEo9B,EAAE7E,cAAc,GAAGv4B,aAAaq9B,kBAAkBD,EAAErF,iBAAiB/kB,EAAEokB,OAAO,YAAYpkB,EAAEokB,OAA+B,mBAAjBpkB,EAAEokB,MAAMkG,SAAqBtqB,EAAEokB,MAAMkG,QAAQF,GAAGp9B,aAAaq9B,iBAAiB,CAAC,IAAI1jC,EAAE8pB,SAAS8Z,eAAev9B,EAAEq3B,SAAS,GAAG19B,EAAE,CAAC,IAAIu9B,EAAEv9B,EAAE2yB,aAAa,YAAY,GAAO,SAAJ4K,GAAgB,KAAJA,EAAO,OAAO,IAAItF,EAAEj4B,EAAE2yB,aAAa,iBAAiB,GAAO,SAAJsF,GAAgB,KAAJA,EAAO,QAAQj4B,aAAas1B,mBAA4B,UAATt1B,EAAEI,MAAyB,aAATJ,EAAEI,OAA6B,UAATJ,EAAE6gC,MAAyB,aAAT7gC,EAAE6gC,MAA4B,WAAT7gC,EAAE6gC,OAAkB7gC,EAAE6jC,QAAQ7jC,EAAEw1B,MAAM,CAACC,eAAc,GAAI,CAAC,KAAI9L,EAAE3nB,IAAG,EAAGm5B,GAAE,cAAE,KAAI,IAAK9hB,EAAEskB,KAAKvG,SAASzN,KAAI,CAACtQ,EAAEskB,KAAKhU,IAAI/kB,EAAE,CAAC40B,IAAIhQ,KAAKnQ,EAAEokB,MAAMlF,GAAG1rB,EAAE6wB,QAAQvgB,EAAEwmB,QAAQ/Z,GAAG,OAAOroB,IAAI,YAAYqD,WAAWA,EAAE84B,eAAe94B,EAAE++B,SAAS,YAAYljC,UAAUA,EAAEkjC,UAAS,QAAE,CAAC9F,SAASj5B,EAAEk5B,WAAWr9B,EAAEk9B,KAAKxC,EAAE4C,WAAW5gB,EAAv+B,QAA2+B,MAAMpU,KAAKsQ,EAAEtQ,MAAM,SAAS,IAAY+6B,EAAE7+B,OAAO8iB,OAAO2S,EAAE,CAAC,uHCAl8D,SAASc,GAAGpE,SAAS/d,GAAE,GAAI,CAAC,GAAG,IAAIxM,GAAE,YAAE,OAAO7M,EAAEwf,IAAG,eAAE,GAAIhD,GAAE,SAAIyL,GAAE,QAAE,KAAKpb,EAAEwoB,QAAQ,KAAK7V,GAAE,GAAIhD,EAAEwjB,SAAQ,IAAIp7B,GAAE,QAAEuY,IAAI,GAAGX,EAAEwjB,UAAsB,OAAZnzB,EAAEwoB,QAAe,CAACxoB,EAAEwoB,QAAQlY,EAAEyhB,cAAcpf,GAAE,GAAI,CAAC,IAAI/e,GAAE,OAAE0c,EAAEyhB,eAAepiB,EAAE4R,iBAAiB3tB,EAAE,YAAYwnB,GAAE,GAAIzL,EAAE4R,iBAAiB3tB,EAAE,eAAcsoB,IAAI,GAAGlc,EAAEwoB,QAAQ,CAAC,IAAI7L,EAAvgB,SAAWnQ,GAAG,IAAIxM,EAAEwM,EAAEuT,MAAM,EAAE5sB,EAAEqZ,EAAEwT,OAAO,EAAE,MAAM,CAACiN,IAAIzgB,EAAE0qB,QAAQ/jC,EAAEgkC,MAAM3qB,EAAE4qB,QAAQp3B,EAAEq3B,OAAO7qB,EAAE0qB,QAAQ/jC,EAAE+5B,KAAK1gB,EAAE4qB,QAAQp3B,EAAE,CAAiZ0wB,CAAExU,GAAGvJ,EAArZ,SAAWnG,EAAExM,GAAG,SAASwM,IAAIxM,GAAGwM,EAAE2qB,MAAMn3B,EAAEktB,MAAM1gB,EAAE0gB,KAAKltB,EAAEm3B,OAAO3qB,EAAE6qB,OAAOr3B,EAAEitB,KAAKzgB,EAAEygB,IAAIjtB,EAAEq3B,OAAO,CAAwThJ,CAAE1R,EAAE3c,EAAEwoB,QAAQvI,yBAAyB,KAAG,GAAItQ,EAAE4R,iBAAiB3tB,EAAE,gBAAgBwnB,GAAE,EAAG,CAAC,KAAI,MAAM,CAACkX,QAAQn/B,EAAEo/B,WAAW/lB,EAAE,CAAC,EAAE,CAAC8qB,cAAcv/B,EAAEw/B,YAAYnc,EAAE0b,QAAQ1b,GAAG,qFCAt1B,SAASzI,EAAEnG,EAAEmD,GAAG,OAAW,OAAJnD,GAAc,OAAJmD,GAAoB,iBAAHnD,GAAuB,iBAAHmD,GAAa,OAAOnD,GAAG,OAAOmD,EAAEnD,EAAEkf,KAAK/b,EAAE+b,GAAGlf,IAAImD,CAAC,CAAC,SAASoN,EAAEvQ,EAAEmG,GAAG,OAAO,kBAAE,CAAChD,EAAE3P,KAAK,GAAa,iBAAHwM,EAAY,CAAC,IAAI4O,EAAE5O,EAAE,OAAU,MAAHmD,OAAQ,EAAOA,EAAEyL,OAAU,MAAHpb,OAAQ,EAAOA,EAAEob,GAAG,CAAC,OAAO5O,EAAEmD,EAAE3P,EAAC,GAAG,CAACwM,GAAG,gGCA5M,SAASgrB,EAAE7kB,EAAEhD,EAAEuM,GAAG,IAAItoB,EAAE0c,IAAG,cAAE4L,GAAG1P,OAAM,IAAJmG,EAAW3S,GAAE,YAAEwM,GAAGuQ,GAAE,aAAE,GAAID,GAAE,aAAE,GAAI,OAAOtQ,GAAIxM,EAAEwoB,SAAUzL,EAAEyL,SAAmNhc,GAAGxM,EAAEwoB,UAAU1L,EAAE0L,UAAU1L,EAAE0L,SAAQ,EAAGxoB,EAAEwoB,QAAQhc,EAAE1X,QAAQhB,MAAM,mKAA5QipB,EAAEyL,SAAQ,EAAGxoB,EAAEwoB,QAAQhc,EAAE1X,QAAQhB,MAAM,kKAAuY,CAAC0Y,EAAEmG,EAAE/e,GAAE,QAAET,IAAIqZ,GAAG8D,EAAEnd,GAAM,MAAHwc,OAAQ,EAAOA,EAAExc,MAAK,qFCArnB,SAASwf,EAAEnG,GAAG,IAAIxM,IAAG,cAAEwM,GAAG,OAAOxM,CAAC,gGCA2K,SAASjI,EAAEyU,EAAErZ,GAAE,GAAI,IAAI6M,EAAM,OAAJwM,EAAS,KAAK,YAAYA,EAAEA,EAAEgc,QAAQhc,GAAGmG,EAAEoK,IAAG,iBAAE,KAAI,CAAG,IAAE,CAAC,GAAGpN,GAAE,cAAE,IAAtN,SAAWnD,GAAG,GAAO,OAAJA,EAAS,MAAM,CAACuT,MAAM,EAAEC,OAAO,GAAG,IAAID,MAAM5sB,EAAE6sB,OAAOhgB,GAAGwM,EAAEyT,wBAAwB,MAAM,CAACF,MAAM5sB,EAAE6sB,OAAOhgB,EAAE,CAA+FsQ,CAAEtQ,IAAG,CAACA,EAAE2S,IAAI,OAAO,QAAE,KAAK,IAAI3S,EAAE,OAAO,IAAIpM,EAAE,IAAIssB,eAAenD,GAAG,OAAOnpB,EAAE8sB,QAAQ1gB,GAAG,KAAKpM,EAAEgvB,YAAW,CAAC,GAAG,CAAC5iB,IAAI7M,EAAE,CAAC4sB,MAAM,GAAGpQ,EAAEoQ,UAAUC,OAAO,GAAGrQ,EAAEqQ,YAAYrQ,CAAC,gGCA5Y,SAAS/b,EAAEoM,GAAG,IAAI7M,EAAE,GAAG6M,EAAEzM,KAAK,OAAOyM,EAAEzM,KAAK,IAAIiZ,EAAY,OAATrZ,EAAE6M,EAAEy3B,IAAUtkC,EAAE,SAAS,MAAa,iBAAHqZ,GAA+B,WAAlBA,EAAEkrB,cAA+B,cAAxD,CAAgE,CAAC,SAASF,EAAEx3B,EAAEwM,GAAG,IAAIrZ,EAAE4pB,IAAG,eAAE,IAAInpB,EAAEoM,KAAI,OAAO,QAAE,KAAK+c,EAAEnpB,EAAEoM,GAAE,GAAG,CAACA,EAAEzM,KAAKyM,EAAEy3B,MAAK,QAAE,KAAKtkC,GAAGqZ,EAAEgc,SAAShc,EAAEgc,mBAAmBmP,oBAAoBnrB,EAAEgc,QAAQwM,aAAa,SAASjY,EAAE,SAAQ,GAAG,CAAC5pB,EAAEqZ,IAAIrZ,CAAC,qFCA/Y,SAAS6M,EAAEwM,GAAG,MAAM,CAACA,EAAEorB,QAAQprB,EAAEqrB,QAAQ,CAAC,SAAS9a,IAAI,IAAIvQ,GAAE,YAAE,EAAE,GAAG,IAAI,MAAM,CAAC,QAAAopB,CAASjmB,GAAG,IAAIxc,EAAE6M,EAAE2P,GAAG,OAAOnD,EAAEgc,QAAQ,KAAKr1B,EAAE,IAAIqZ,EAAEgc,QAAQ,KAAKr1B,EAAE,MAAOqZ,EAAEgc,QAAQr1B,GAAE,EAAG,EAAE,MAAAwiC,CAAOhmB,GAAGnD,EAAEgc,QAAQxoB,EAAE2P,EAAE,EAAE,2GCA/D,SAAS6b,GAAGmJ,UAAUnoB,EAAEqoB,OAAO70B,EAAEm1B,KAAKxlB,EAAEilB,QAAQ1Y,GAAE,IAAK,IAAId,GAAE,YAAEpb,GAAG2S,GAAE,YAAEhD,IAAG,gBAAE,KAAKyL,EAAEoN,QAAQxoB,EAAE2S,EAAE6V,QAAQ7Y,IAAG,CAAC3P,EAAE2P,KAAI,QAAE,KAAK,IAAInD,IAAI0P,EAAE,OAAO,IAAI/oB,GAAE,OAAEqZ,GAAG,IAAIrZ,EAAE,OAAO,IAAI4E,EAAEqjB,EAAEoN,QAAQ7L,EAAEhK,EAAE6V,QAAQ1L,EAAE1kB,OAAO8iB,QAAOtnB,GAAGmE,EAAEnE,IAAG,CAACkkC,WAAW//B,IAAIglB,EAAE5pB,EAAE4kC,iBAAiBvrB,EAAEsoB,WAAWkD,aAAalb,GAAE,GAAI,KAAKC,EAAEkb,YAAYtb,EAAEI,EAAEmb,YAAW,GAAG,CAAC1rB,EAAE0P,EAAEd,EAAEzI,GAAG,0NC4C7e,SAASwlB,IACP,MAAMC,EAASC,UAAUC,cACzB,OAAIF,GAAU/jC,MAAMoF,QAAQ2+B,EAAOG,QAC1BH,EAAOG,OAAOj9B,KAAIk9B,IACvB,IAAI,MACFC,EAAK,QACLriC,GACEoiC,EACJ,OAAOC,EAAQ,IAAMriC,CAAO,IAC3B4d,KAAK,KAEHqkB,UAAUK,SACnB,sCClDIxiC,EAA4B,qBAAb+mB,SAA2B,EAAAP,gBAAkB,EAAAD,UAIhE,SAASkc,EAAUp/B,EAAGC,GACpB,GAAID,IAAMC,EACR,OAAO,EAET,UAAWD,WAAaC,EACtB,OAAO,EAET,GAAiB,oBAAND,GAAoBA,EAAE8J,aAAe7J,EAAE6J,WAChD,OAAO,EAET,IAAItP,EACAH,EACAyE,EACJ,GAAIkB,GAAKC,GAAkB,kBAAND,EAAgB,CACnC,GAAIlF,MAAMoF,QAAQF,GAAI,CAEpB,GADAxF,EAASwF,EAAExF,OACPA,IAAWyF,EAAEzF,OAAQ,OAAO,EAChC,IAAKH,EAAIG,EAAgB,IAARH,KACf,IAAK+kC,EAAUp/B,EAAE3F,GAAI4F,EAAE5F,IACrB,OAAO,EAGX,OAAO,CACT,CAGA,GAFAyE,EAAOD,OAAOC,KAAKkB,GACnBxF,EAASsE,EAAKtE,OACVA,IAAWqE,OAAOC,KAAKmB,GAAGzF,OAC5B,OAAO,EAET,IAAKH,EAAIG,EAAgB,IAARH,KACf,IAAK,CAAC,EAAE4e,eAAepe,KAAKoF,EAAGnB,EAAKzE,IAClC,OAAO,EAGX,IAAKA,EAAIG,EAAgB,IAARH,KAAY,CAC3B,MAAM6B,EAAM4C,EAAKzE,GACjB,IAAY,WAAR6B,IAAoB8D,EAAEq/B,YAGrBD,EAAUp/B,EAAE9D,GAAM+D,EAAE/D,IACvB,OAAO,CAEX,CACA,OAAO,CACT,CACA,OAAO8D,IAAMA,GAAKC,IAAMA,CAC1B,CAEA,SAASq/B,EAAOjZ,GACd,GAAsB,qBAAX5C,OACT,OAAO,EAGT,OADY4C,EAAQkZ,cAAcC,aAAe/b,QACtCgc,kBAAoB,CACjC,CAEA,SAASC,EAAWrZ,EAAStoB,GAC3B,MAAM4hC,EAAML,EAAOjZ,GACnB,OAAOzB,KAAKC,MAAM9mB,EAAQ4hC,GAAOA,CACnC,CAEA,SAASC,EAAa7hC,GACpB,MAAMq1B,EAAM,SAAar1B,GAIzB,OAHApB,GAAM,KACJy2B,EAAInE,QAAUlxB,CAAK,IAEdq1B,CACT,CA+JA,MAuCM3L,EAAS,CAAC3a,EAASiX,KAAS,KAC7B,QAASjX,GACZA,QAAS,CAACA,EAASiX,KAQf8b,EAAQ,CAAC/yB,EAASiX,KAAS,KAC5B,QAAQjX,GACXA,QAAS,CAACA,EAASiX,KAgBf+b,EAAO,CAAChzB,EAASiX,KAAS,KAC3B,QAAOjX,GACVA,QAAS,CAACA,EAASiX,KASf4H,EAAO,CAAC7e,EAASiX,KAAS,KAC3B,QAAOjX,GACVA,QAAS,CAACA,EAASiX,KCnTrB,SAAS,EAAUvU,GACjB,IAAIuwB,EACJ,OAAgB,MAARvwB,GAA8D,OAA7CuwB,EAAsBvwB,EAAK+vB,oBAAyB,EAASQ,EAAoBP,cAAgB/b,MAC5H,CAQA,SAAS,EAAU1lB,GACjB,OAAOA,aAAiBiiC,SAAWjiC,aAAiB,EAAUA,GAAOiiC,OACvE,CCWA,MAAMC,EAAY,IACb,GAICC,EADqBD,EAAUE,oBACgB,CAACnjC,GAAMA,KAC5D,SAASojC,EAAeC,GACtB,MAAMjN,EAAM,UAAa,KACnB,CAAwC,IAO9C,OAHA8M,GAAuB,KACrB9M,EAAInE,QAAUoR,CAAQ,IAEjB,eAAkB,WACvB,IAAK,IAAIC,EAAO7lC,UAAUD,OAAQJ,EAAO,IAAIU,MAAMwlC,GAAOC,EAAO,EAAGA,EAAOD,EAAMC,IAC/EnmC,EAAKmmC,GAAQ9lC,UAAU8lC,GAEzB,OAAsB,MAAfnN,EAAInE,aAAkB,EAASmE,EAAInE,WAAW70B,EACvD,GAAG,GACL,CAEA,MAAMomC,EAAW,UACXC,EAAa,YACbC,EAAa,YACbC,EAAc,aAkQpB,IAAI,EAA4B,qBAAbjd,SAA2B,EAAAP,gBAAkB,EAAAD,UAsIhE,MAIM0d,EAAiB,CAACF,EAAYC,GAC9BE,EAAe,CAACL,EAAUC,GAmLhC,IAAIK,GAAwB,EACxBj1B,EAAQ,EACZ,MAAMk1B,EAAQ,IAEd,eAAiBnc,KAAKoc,SAASl3B,SAAS,IAAI/O,MAAM,EAAG,GAAK8Q,IAc1D,MAQMo1B,EARahB,EAAUgB,OAb7B,WACE,MAAO9O,EAAI+O,GAAS,YAAe,IAAMJ,EAAwBC,SAAU7nC,IAU3E,OATA,GAAM,KACM,MAANi5B,GACF+O,EAAMH,IACR,GAEC,IACH,aAAgB,KACdD,GAAwB,CAAI,GAC3B,IACI3O,CACT,EA0IA,SAASgP,IACP,MAAMp/B,EAAM,IAAI8mB,IAChB,MAAO,CACL,IAAA9uB,CAAKsd,EAAOpM,GACV,IAAIm2B,EAC2B,OAA9BA,EAAWr/B,EAAIonB,IAAI9R,KAAmB+pB,EAAShgC,SAAQlH,GAAWA,EAAQ+Q,IAC7E,EACA,EAAAxP,CAAG4b,EAAOnc,GACR6G,EAAI2pB,IAAIrU,EAAO,IAAKtV,EAAIonB,IAAI9R,IAAU,GAAKnc,GAC7C,EACA,GAAAmmC,CAAIhqB,EAAOnc,GACT,IAAIomC,EACJv/B,EAAI2pB,IAAIrU,GAAwC,OAA/BiqB,EAAYv/B,EAAIonB,IAAI9R,SAAkB,EAASiqB,EAAUniC,QAAOia,GAAKA,IAAMle,MAAc,GAC5G,EAEJ,CAEA,MAAMqmC,EAAmC,gBAAoB,MACvDC,EAAmC,gBAAoB,MAMvDC,EAA0B,KAC9B,IAAIC,EACJ,OAAuE,OAA9DA,EAAoB,aAAiBH,SAAgC,EAASG,EAAkBvP,KAAO,IAAI,EAMhHwP,EAAkB,IAAM,aAAiBH,GAi8D/C,SAAS,EAAY10B,QACH,IAAZA,IACFA,EAAU,CAAC,GAEb,MAAM,OACJ80B,GACE90B,EACE+0B,EAzDR,SAAgC/0B,GAC9B,MAAM,KACJ2mB,GAAO,EACPqO,aAAcC,EACdC,SAAUC,GACRn1B,EACEo1B,EAAajB,IACbpQ,EAAU,SAAa,CAAC,IACvBsR,GAAU,YAAe,IAAMhB,MAChCiB,EAAsC,MAA7BX,KAORY,EAAmBC,GAAwB,WAAeL,EAAaM,WACxET,EAAe1B,GAAe,CAAC3M,EAAMpc,EAAOmrB,KAChD3R,EAAQ5B,QAAQwT,UAAYhP,EAAOpc,OAAQne,EAC3CipC,EAAOpoC,KAAK,aAAc,CACxB05B,OACApc,QACAmrB,SACAJ,WAEkB,MAApBL,GAA4BA,EAAiBtO,EAAMpc,EAAOmrB,EAAO,IAE7DzgB,EAAO,WAAc,KAAM,CAC/BugB,0BACE,IACEN,EAAW,WAAc,KAAM,CACnCO,UAAWF,GAAqBJ,EAAaM,WAAa,KAC1DG,SAAUT,EAAaS,UAAY,KACnCC,aAAcV,EAAaM,aACzB,CAACF,EAAmBJ,EAAaM,UAAWN,EAAaS,WAC7D,OAAO,WAAc,KAAM,CACzB7R,UACA4C,OACAqO,eACAE,WACAG,SACAD,aACAngB,UACE,CAAC0R,EAAMqO,EAAcE,EAAUG,EAAQD,EAAYngB,GACzD,CAa8B6gB,CAAuB,IAC9C91B,EACHk1B,SAAU,CACRO,UAAW,KACXG,SAAU,QACP51B,EAAQk1B,YAGTa,EAAc/1B,EAAQ+1B,aAAehB,EACrCiB,EAAmBD,EAAYb,UAC9Be,EAAeC,GAAmB,WAAe,OACjDX,EAAmBY,GAAyB,WAAe,MAE5DN,GADyC,MAApBG,OAA2B,EAASA,EAAiBP,YACrCQ,EACrCG,EAAkB,SAAa,MAC/BC,EAAOxB,IACb,GAAM,KACAgB,IACFO,EAAgBjU,QAAU0T,EAC5B,GACC,CAACA,IACJ,MAAM5mC,EFhsFR,SAAqB+Q,QACH,IAAZA,IACFA,EAAU,CAAC,GAEb,MAAM,UACJs2B,EAAY,SAAQ,SACpBC,EAAW,WAAU,WACrBC,EAAa,GAAE,SACfC,EACAvB,UACEO,UAAWiB,EACXd,SAAUe,GACR,CAAC,EAAC,UACN7P,GAAY,EAAI,qBAChB8P,EAAoB,KACpBjQ,GACE3mB,GACG7B,EAAM04B,GAAW,WAAe,CACrC9R,EAAG,EACHmD,EAAG,EACHqO,WACAD,YACAQ,eAAgB,CAAC,EACjBC,cAAc,KAETC,EAAkBC,GAAuB,WAAeT,GAC1DlE,EAAU0E,EAAkBR,IAC/BS,EAAoBT,GAEtB,MAAOU,EAAYC,GAAiB,WAAe,OAC5CC,EAAWC,GAAgB,WAAe,MAC3CC,EAAe,eAAkB50B,IACjCA,IAAS60B,EAAapV,UACxBoV,EAAapV,QAAUzf,EACvBy0B,EAAcz0B,GAChB,GACC,IACG80B,EAAc,eAAkB90B,IAChCA,IAAS+0B,EAAYtV,UACvBsV,EAAYtV,QAAUzf,EACtB20B,EAAa30B,GACf,GACC,IACGg1B,EAAchB,GAAqBQ,EACnCS,EAAahB,GAAoBS,EACjCG,EAAe,SAAa,MAC5BE,EAAc,SAAa,MAC3B1T,EAAU,SAAa5lB,GACvBy5B,EAAkD,MAAxBhB,EAC1BiB,EAA0B/E,EAAa8D,GACvCkB,EAAchF,EAAa2D,GAC3BnH,EAAS,eAAkB,KAC/B,IAAKiI,EAAapV,UAAYsV,EAAYtV,QACxC,OAEF,MAAM4V,EAAS,CACbzB,YACAC,WACAC,WAAYQ,GAEVc,EAAY3V,UACd4V,EAAOtB,SAAWqB,EAAY3V,UAEhC,QAAgBoV,EAAapV,QAASsV,EAAYtV,QAAS4V,GAAQ/xB,MAAK7H,IACtE,MAAM65B,EAAW,IACZ75B,EACH44B,cAAc,GAEZkB,EAAa9V,UAAYmQ,EAAUvO,EAAQ5B,QAAS6V,KACtDjU,EAAQ5B,QAAU6V,EAClB,aAAmB,KACjBnB,EAAQmB,EAAS,IAErB,GACA,GACD,CAAChB,EAAkBV,EAAWC,EAAUuB,IAC3CjoC,GAAM,MACS,IAAT82B,GAAkB5C,EAAQ5B,QAAQ4U,eACpChT,EAAQ5B,QAAQ4U,cAAe,EAC/BF,GAAQ14B,IAAQ,IACXA,EACH44B,cAAc,MAElB,GACC,CAACpQ,IACJ,MAAMsR,EAAe,UAAa,GAClCpoC,GAAM,KACJooC,EAAa9V,SAAU,EAChB,KACL8V,EAAa9V,SAAU,CAAK,IAE7B,IACHtyB,GAAM,KAGJ,GAFI6nC,IAAaH,EAAapV,QAAUuV,GACpCC,IAAYF,EAAYtV,QAAUwV,GAClCD,GAAeC,EAAY,CAC7B,GAAIE,EAAwB1V,QAC1B,OAAO0V,EAAwB1V,QAAQuV,EAAaC,EAAYrI,GAElEA,GACF,IACC,CAACoI,EAAaC,EAAYrI,EAAQuI,EAAyBD,IAC9D,MAAM3iB,EAAO,WAAc,KAAM,CAC/BwgB,UAAW8B,EACX3B,SAAU6B,EACVH,eACAE,iBACE,CAACF,EAAcE,IACbtC,EAAW,WAAc,KAAM,CACnCO,UAAWiC,EACX9B,SAAU+B,KACR,CAACD,EAAaC,IACZO,EAAiB,WAAc,KACnC,MAAMC,EAAgB,CACpBlpC,SAAUsnC,EACV1P,KAAM,EACND,IAAK,GAEP,IAAKsO,EAASU,SACZ,OAAOuC,EAET,MAAMpT,EAAI6N,EAAWsC,EAASU,SAAUz3B,EAAK4mB,GACvCmD,EAAI0K,EAAWsC,EAASU,SAAUz3B,EAAK+pB,GAC7C,OAAIpB,EACK,IACFqR,EACHrR,UAAW,aAAe/B,EAAI,OAASmD,EAAI,SACvCsK,EAAO0C,EAASU,WAAa,KAAO,CACtCwC,WAAY,cAIX,CACLnpC,SAAUsnC,EACV1P,KAAM9B,EACN6B,IAAKsB,EACN,GACA,CAACqO,EAAUzP,EAAWoO,EAASU,SAAUz3B,EAAK4mB,EAAG5mB,EAAK+pB,IACzD,OAAO,WAAc,KAAM,IACtB/pB,EACHmxB,SACAra,OACAigB,WACAgD,oBACE,CAAC/5B,EAAMmxB,EAAQra,EAAMigB,EAAUgD,GACrC,CE+iFmBG,CAAc,IAC1Br4B,EACHk1B,SAAU,IACLc,KACCT,GAAqB,CACvBE,UAAWF,MAIXC,EAAuB,eAAkB9yB,IAC7C,MAAM41B,EAA4B,EAAU51B,GAAQ,CAClDkX,sBAAuB,IAAMlX,EAAKkX,wBAClC2e,eAAgB71B,GACdA,EAGJyzB,EAAsBmC,GACtBrpC,EAASgmB,KAAKqiB,aAAagB,EAA0B,GACpD,CAACrpC,EAASgmB,OACPqiB,EAAe,eAAkB50B,KACjC,EAAUA,IAAkB,OAATA,KACrB0zB,EAAgBjU,QAAUzf,EAC1BwzB,EAAgBxzB,KAKd,EAAUzT,EAASgmB,KAAKwgB,UAAUtT,UAAgD,OAApClzB,EAASgmB,KAAKwgB,UAAUtT,SAIjE,OAATzf,IAAkB,EAAUA,KAC1BzT,EAASgmB,KAAKqiB,aAAa50B,EAC7B,GACC,CAACzT,EAASgmB,OACPA,EAAO,WAAc,KAAM,IAC5BhmB,EAASgmB,KACZqiB,eACA9B,uBACAK,aAAcO,KACZ,CAACnnC,EAASgmB,KAAMqiB,EAAc9B,IAC5BN,EAAW,WAAc,KAAM,IAChCjmC,EAASimC,SACZW,aAAcA,KACZ,CAAC5mC,EAASimC,SAAUW,IAClB/nC,EAAU,WAAc,KAAM,IAC/BmB,KACA8mC,EACH9gB,OACAigB,WACAJ,YACE,CAAC7lC,EAAUgmB,EAAMigB,EAAUJ,EAAQiB,IAQvC,OAPA,GAAM,KACJA,EAAYhS,QAAQ5B,QAAQqW,gBAAkB1qC,EAC9C,MAAM4U,EAAe,MAAR2zB,OAAe,EAASA,EAAKoC,SAAStW,QAAQxvB,MAAK+P,GAAQA,EAAK2iB,KAAOyP,IAChFpyB,IACFA,EAAK5U,QAAUA,EACjB,IAEK,WAAc,KAAM,IACtBmB,EACHnB,UACAmnB,OACAigB,cACE,CAACjmC,EAAUgmB,EAAMigB,EAAUpnC,GACjC,CA2IA,MAAM4qC,EAAa,SACbC,EAAe,WACrB,SAASC,EAAWC,EAAWC,EAAWC,GACxC,MAAM9jC,EAAM,IAAI8mB,IACVid,EAAwB,SAAfD,EACf,IAAIE,EAAeJ,EACnB,GAAIG,GAAUH,EAAW,CACvB,MACE,CAACH,GAAa/T,EACd,CAACgU,GAAeO,KACbC,GACDN,EACJI,EAAeE,CACjB,CACA,MAAO,IACc,aAAfJ,GAA6B,CAC/B1M,UAAW,MAEV4M,KACAH,EAAU7jC,KAAIhE,IACf,MAAMmoC,EAAkBnoC,EAAQA,EAAM8nC,GAAc,KACpD,MAA+B,oBAApBK,EACFP,EAAYO,EAAgBP,GAAa,KAE3CO,CAAe,IACrB/nC,OAAOwnC,GAAW5mC,QAAO,CAAC8J,EAAKwuB,IAC3BA,GAGLx4B,OAAOgoB,QAAQwQ,GAAOj2B,SAAQ69B,IAC5B,IAAK/iC,EAAK6B,GAASkhC,EASf,IAAImC,EARJ0E,GAAU,CAACN,EAAYC,GAAcU,SAASjqC,KAGxB,IAAtBA,EAAIsD,QAAQ,OACTuC,EAAI+a,IAAI5gB,IACX6F,EAAI2pB,IAAIxvB,EAAK,IAEM,oBAAV6B,IAEoB,OAA5BqjC,EAAWr/B,EAAIonB,IAAIjtB,KAAiBklC,EAAS/lC,KAAK0C,GACnD8K,EAAI3M,GAAO,WAET,IADA,IAAIolC,EACKhB,EAAO7lC,UAAUD,OAAQJ,EAAO,IAAIU,MAAMwlC,GAAOC,EAAO,EAAGA,EAAOD,EAAMC,IAC/EnmC,EAAKmmC,GAAQ9lC,UAAU8lC,GAEzB,OAAqC,OAA7Be,EAAYv/B,EAAIonB,IAAIjtB,SAAgB,EAASolC,EAAUv/B,KAAI/E,GAAMA,KAAM5C,KAAOqF,MAAK4E,QAAenL,IAARmL,GACpG,IAGFwE,EAAI3M,GAAO6B,EACb,IAEK8K,GA1BEA,GA2BR,CAAC,GAER,CAi8BA,SAASu9B,EAAgCn8B,EAAOwc,GAC9C,MAAO,IACFxc,EACHo8B,MAAO,IACFp8B,EAAMo8B,MACT3D,SAAU,IACLz4B,EAAMo8B,MAAM3D,SACfjc,WAIR,CAMA,MAAM6f,EAAQjP,IAAS,CACrB10B,KAAM,QACNmK,QAASuqB,EACT,QAAMr6B,CAAGiN,GACP,MAAM,QACJs8B,EAAO,YACPC,EAAW,iBACXC,EACAhf,OAAQif,EAAc,EAAC,MACvB/pC,EAAQ,EAAC,gBACTgqC,EAAkB,EAAC,2BACnBC,EAA6B,EAAC,UAC9BC,KACGC,GACDzP,GACE,MACJgP,EACArE,UAAU,SACRU,IAEAz4B,EACEkF,EAAOo3B,EAAQtX,QAAQtyB,GAM7B,IAAKwS,EACH,MAAO,CAAC,EAEV,MAAM43B,EAAW,IACZ98B,WACOwd,GAAQtY,EAAK63B,UAAYtE,EAASuE,UAAYZ,EAAM9D,UAAU9b,OAAS,EAAItX,EAAK+3B,aAAe,EAAIR,GAAa1pC,GAAGiN,IAEzH7J,GAAmB,MAAbymC,OAAoB,EAASA,EAAU5X,UAAYyT,EACzDyE,QAAiB,QAAef,EAAgCW,EAAU3mC,EAAGgnC,cAAeN,GAC5FO,QAAoB,QAAeN,EAAU,IAC9CD,EACHQ,eAAgB,cAEZC,EAAQ3iB,KAAKO,IAAI,EAAGgiB,EAASzT,KAC7B8T,EAAQT,EAAS/R,EAAIuS,EACrBE,EAAY7iB,KAAKO,IAAI,EAAG/kB,EAAGgnC,aAAeG,EAAQ3iB,KAAKO,IAAI,EAAGgiB,EAASrJ,SAkB7E,OAjBA19B,EAAG+yB,MAAMsU,UAAYA,EAAY,KACjCrnC,EAAGo5B,UAAY+N,EAGXd,IACErmC,EAAG8mC,aAAe/3B,EAAK+3B,aAAetiB,KAAKQ,IAAIuhB,EAAiBJ,EAAQtX,QAAQz0B,OAAS,GAAK,GAAK6sC,EAAY3T,MAAQkT,GAA8BS,EAAYvJ,SAAW8I,GAC9K,IAAA9X,YAAU,IAAM2X,GAAiB,MAEjC,IAAA3X,YAAU,IAAM2X,GAAiB,MAGjCD,IACFA,EAAYvX,cAAgB,QAAemX,EAAgC,IACtEW,EACH/R,EAAGwS,GACFpnC,EAAG8mC,cAAeJ,IAEhB,CACL9R,EAAGwS,EAEP,yCCxiIse,IAAIxS,GAAE,mBAAE,CAAC0S,YAAO,EAAOtD,aAAa,OAAOE,YAAY,OAAOqD,kBAAkB,KAAI,CAAG,GAAEC,iBAAiB,KAAI,CAAG,GAAErQ,KAAK,CAAC,IAAIvC,EAAEvC,YAAY,kBAAkB,IAAIoV,GAAE,mBAAE,MAAuC,SAASC,EAAG70B,GAAG,OAAO,cAAE,IAAIA,EAAY,iBAAHA,EAAY,CAAC80B,GAAG90B,GAAGA,EAAE,MAAK,CAACA,GAAG,CAAC,SAAS+0B,IAAK,OAAO,gBAAEhT,GAAGoP,YAAY,CAAC,SAAS6D,IAAK,OAAO,gBAAEjT,GAAG2S,iBAAiB,CAAC,SAASlR,IAAK,IAAImR,iBAAiB30B,EAAEskB,KAAK9wB,IAAG,gBAAEuuB,GAAG,OAAO,kBAAG,IAAIp7B,IAAIiF,OAAO8iB,OAAO,CAAC,EAAE1O,KAAKrZ,GAAG,CAAC,cAAc6M,EAAEu0B,UAAS,CAAC/nB,EAAExM,GAAG,CAAC,SAASyhC,GAAGj1B,EAAE,OAAU,IAAJA,IAASA,EAAE,MAAgB,iBAAHA,IAAcA,EAAE,CAAC80B,GAAG90B,IAAI,IAAIxM,GAAE,gBAAEohC,GAAGjuC,GAAE,cAAE,IAAIqZ,GAAE,CAAClJ,KAAKC,UAAUiJ,EAAsB,oBAAbk1B,YAAyB,CAACnoC,EAAEoW,IAAIA,aAAa+xB,YAAY/xB,EAAEgyB,UAAUhyB,OAAE,MAAU,QAAE,KAAQ,MAAH3P,GAASA,EAAK,MAAH7M,EAAQA,EAAE,KAAI,GAAG,CAAC6M,EAAE7M,IAAI,IAAIwf,GAAE,gBAAE4b,GAAG,OAAO,cAAE,IAAI,CAAC5b,EAAEkrB,YAAYrxB,EAAEmG,EAAEsuB,OAAO,CAAC,IAAG,CAACtuB,EAAEkrB,YAAYrxB,EAAEmG,EAAEsuB,QAAQ,CAApnBG,EAAEpV,YAAY,mBAAumB,IAAIhe,GAAE,EAAE,SAASwhB,IAAIvmB,SAASuD,EAAEooB,QAAQ50B,GAAE,IAAK,IAAI7M,EAAEwf,IAAG,cAAE,OAAOpZ,EAAEoW,IAAG,cAAE,GAAGuM,GAAE,YAAG,OAAOa,EAAEnpB,IAAG,cAAE,OAAgrD,SAAY4Y,IAAG,QAAE,KAAK,IAAIA,EAAE,OAAO,IAAIxM,EAAE,IAAI4hC,kBAAiB,KAAK,IAAIzuC,EAAEqZ,EAAEkgB,MAAMsU,UAAU5lC,WAAWjI,KAAKskB,SAAStkB,KAAKqZ,EAAEkgB,MAAMsU,UAAU,GAAG7iB,KAAK0jB,KAAKzmC,WAAWjI,QAAO,IAAI,OAAO6M,EAAE0gB,QAAQlU,EAAE,CAAC1G,YAAW,EAAGg8B,gBAAgB,CAAC,WAAW,KAAK9hC,EAAE4iB,YAAW,CAAC,GAAG,CAACpW,GAAG,CAAh7Du1B,CAAGhlB,GAAG,IAAI3B,EAAEpb,GAAO,OAAJ7M,GAAc,OAAJ4pB,GAAUukB,GAAG9V,EAAE,SAAShI,IAAI8K,EAAE,EAAEtN,OAAOghB,EAAE,EAAEC,QAAQtlB,EAAE,EAAEkjB,MAAMxR,GAA21D,SAAY7hB,EAAExM,GAAG,IAAI2P,EAAEuM,EAAEa,EAAE,IAAI5pB,EAAEyjC,GAA4B,OAAzBjnB,EAAK,MAAHnD,OAAQ,EAAOA,EAAEgX,KAAW7T,EAAE,uBAAuB3P,GAAG2S,EAAEikB,GAA+B,OAA5B1a,EAAK,MAAH1P,OAAQ,EAAOA,EAAEwU,QAAc9E,EAAE,0BAA0Blc,GAAGzG,EAAEq9B,GAAgC,OAA7B7Z,EAAK,MAAHvQ,OAAQ,EAAOA,EAAEy1B,SAAellB,EAAE,2BAA2B/c,GAAG,MAAM,IAAIwM,EAAEgX,IAAIrwB,EAAE6tB,OAAOrO,EAAEsvB,QAAQ1oC,EAAE,CAAvmE2oC,CAAG/uC,EAAE4pB,IAAIzM,EAAEvY,EAAE,UAAUyzB,EAAEtoB,MAAM,MAAK,QAAE,KAAKkY,GAAGzL,EAAE,EAAC,GAAG,CAACyL,IAAI,IAAIE,KAAK9hB,EAAE+kC,eAAevP,EAAE76B,QAAQgB,GAAG,EAAG,CAAC63B,KAAK5R,EAAEuhB,UAAc,cAAJrsB,EAAoB,WAAJvY,EAAa,SAAS,UAAUA,IAAQ,WAAJA,EAAa,GAAGuY,IAAI,GAAGA,KAAKvY,IAAI6kC,SAAS,WAAWzP,WAAU,EAAG0P,WAAW,CAAC,EAAG,CAACsF,SAAa,cAAJ7xB,EAAgB,EAAEge,EAAE8T,UAAUJ,IAAI,EAAG,CAACC,QAAQtlB,IAAQ,cAAJrM,GAAiB,EAAG,CAAC2xB,QAAQtlB,IAAQ,cAAJrM,GAAiB+d,EAAE,EAAG,IAAIA,EAAE4T,QAAQtlB,EAAEojB,YAAY7jB,EAAE8E,OAAOznB,EAAE2mC,gBAAgBlyB,GAAEmyB,2BAA2BxjB,EAAE,gBAAAqjB,CAAiBtR,GAAG,IAAII,EAAE5zB,EAAE,IAAIwzB,EAAE,OAAO,IAAI5R,EAAE3nB,EAAEomC,SAASU,SAAS,IAAInf,EAAE,OAAO,IAAI0a,EAAEp8B,WAAWgxB,iBAAiBtP,GAAGulB,sBAAsB,EAAE1T,EAAExQ,KAAKQ,IAAI3Q,GAAE8O,EAAEwlB,mBAAmB7R,EAAE,EAAE5B,EAAE,EAAE,IAAI,IAAIn6B,KAA2D,OAAtDwG,EAA2B,OAAxB4zB,EAAE35B,EAAEomC,SAASU,eAAgB,EAAOnN,EAAEyT,YAAkBrnC,EAAE,GAAG,GAAGxG,aAAagtC,YAAY,CAAC,IAAItW,EAAE12B,EAAE6rC,UAAUjR,EAAElE,EAAE12B,EAAE8tC,aAAahL,EAAEiL,EAAE3lB,EAAEiW,UAAUlF,EAAE4U,EAAE3lB,EAAE0lB,aAAa,KAAGpX,GAAGqX,GAAGnT,GAAGzB,GAAU,CAACgB,EAAE1Q,KAAKO,IAAI,EAAEP,KAAKQ,IAAI2Q,EAAEzB,GAAG1P,KAAKO,IAAI0M,EAAEqX,IAAIhS,EAAE/7B,EAAE8tC,aAAa,KAAK,CAAzE7T,GAA0E,CAACA,GAAG,GAAGhf,GAAEjb,IAAI,IAAI02B,EAAEqF,EAAE9B,EAAEE,EAAE2I,EAAE,OAAO9iC,GAAG02B,EAAE12B,EAAE02B,IAAG,IAAI,KAAK,EAAG,CAAC6W,QAAQtlB,EAAE,KAAApoB,EAAOmuC,eAAehU,EAAEiU,gBAAgB7lB,EAAEye,SAAS/D,IAAIp/B,OAAO8iB,OAAOsc,EAAEyE,SAASvP,MAAM,CAACgU,SAAS,OAAOkC,SAAS,GAAGlU,MAAMsS,UAAU,wCAAwClkB,QAAQ,KAAKpkB,OAAOG,SAASokC,qBAAqB,QAAKzO,EAAEle,EAAE+a,EAAEtzB,GAAG5C,EAAEwnC,UAAUz5B,MAAM,KAAS,cAAJoN,IAAkBke,EAAE,aAAa,IAAIqU,GAAE,cAAE,KAAI,CAAEtO,OAAO,CAAC/F,EAAEnD,GAAG3yB,OAAOG,SAASmb,KAAK,QAAO,CAACwa,EAAEnD,IAAI4L,ED+iI5uF,SAAwB9iC,EAASy8B,GAC/B,MAAM,KACJ5D,EAAI,SACJuO,GACEpnC,GACE,QACJygC,GAAU,EAAI,YACdmL,EAAW,UACXK,EACAxhB,SAAUkkB,GACRlS,EACEhS,EAAW+a,EAAemJ,GAC1BC,EAAyB,UAAa,GACtCC,EAAmB,SAAa,MAChCC,EAAqB,SAAa,MAiDxC,OAhDA,aAAgB,KACd,IAAKrO,EACH,OAEF,SAASS,EAAQ7oB,GACf,GAAIA,EAAE02B,UAAYvpC,GAA6B,MAAvBomC,EAAYvX,QAClC,OAEF,MAAM2a,EAAK32B,EAAE42B,OACPC,EAAUtD,EAAYvX,QAAQyE,MAAQ,GACtCqW,EAAavD,EAAYvX,QAAQ6O,SAAW,GAC5CkM,EAAkB5pC,EAAGgnC,aAAehnC,EAAG6oC,aACvCgB,EAAOL,EAAK,GAAK,EAAI,EACrBM,EAASN,EAAK,EAAI,MAAQ,MAC5BxpC,EAAGgnC,cAAgBhnC,EAAG6oC,gBAGrBa,GAAWF,EAAK,IAAMG,GAAcH,EAAK,GAC5C32B,EAAE+kB,kBACF,IAAAlJ,YAAU,KACRzJ,GAAS9B,GAAKA,EAAIqB,KAAKslB,GAAQN,EAAII,EAAkBC,IAAM,KAEpD,WAAW5tB,KAAKuiB,OAGzBx+B,EAAGo5B,WAAaoQ,GAEpB,CACA,MAAMxpC,GAAmB,MAAbymC,OAAoB,EAASA,EAAU5X,UAAY+S,EAASU,SACxE,OAAIjP,GAAQrzB,GACVA,EAAG4nB,iBAAiB,QAAS8T,GAG7BpC,uBAAsB,KACpB+P,EAAiBxa,QAAU7uB,EAAGo5B,UACH,MAAvBgN,EAAYvX,UACdya,EAAmBza,QAAU,IACxBuX,EAAYvX,SAEnB,IAEK,KACLwa,EAAiBxa,QAAU,KAC3Bya,EAAmBza,QAAU,KAC7B7uB,EAAG6nB,oBAAoB,QAAS6T,EAAQ,QAf5C,CAiBA,GACC,CAACT,EAAS5H,EAAMuO,EAASU,SAAU8D,EAAaK,EAAWxhB,IACvD,WAAc,IACdgW,EAGE,CACLqH,SAAU,CACR,SAAArJ,GACEmQ,EAAuBva,SAAU,CACnC,EACA,OAAA6M,GACE0N,EAAuBva,SAAU,CACnC,EACA,aAAAwN,GACE+M,EAAuBva,SAAU,CACnC,EACA,QAAAkb,GACE,MAAM/pC,GAAmB,MAAbymC,OAAoB,EAASA,EAAU5X,UAAY+S,EAASU,SACxE,GAAK8D,EAAYvX,SAAY7uB,GAAOopC,EAAuBva,QAA3D,CAGA,GAAiC,OAA7Bwa,EAAiBxa,QAAkB,CACrC,MAAMmb,EAAahqC,EAAGo5B,UAAYiQ,EAAiBxa,SAC/CuX,EAAYvX,QAAQ6O,QAAU,IAAOsM,GAAc,GAAK5D,EAAYvX,QAAQyE,KAAO,IAAO0W,EAAa,KACzG,IAAAtb,YAAU,IAAMzJ,GAAS9B,GAAKA,EAAI6mB,KAEtC,CAGA1Q,uBAAsB,KACpB+P,EAAiBxa,QAAU7uB,EAAGo5B,SAAS,GAVzC,CAYF,IA7BK,CAAC,GAgCT,CAAC6B,EAASmL,EAAaxE,EAASU,SAAUmE,EAAWxhB,GAC1D,CCjpI8uF,CAAGzpB,EAAE,CAAC4qC,YAAY7jB,EAAE0C,SAASjP,KAAKuxB,kBAAkB/U,EAAEgV,iBAAiBlS,GD8hGrzF,SAAyBkQ,QACL,IAAdA,IACFA,EAAY,IAId,MAAM7hB,EAAO6hB,EACP+B,EAAoB,eAAkBhC,GAAaD,EAAWC,EAAWC,EAAW,cAE1F7hB,GACM6jB,EAAmB,eAAkBjC,GAAaD,EAAWC,EAAWC,EAAW,aAEzF7hB,GACMsmB,EAAe,eAAkB1E,GAAaD,EAAWC,EAAWC,EAAW,SAMrFA,EAAU7jC,KAAI7F,GAAc,MAAPA,OAAc,EAASA,EAAIiT,QAChD,OAAO,WAAc,KAAM,CACzBw4B,oBACAC,mBACAyC,kBACE,CAAC1C,EAAmBC,EAAkByC,GAC5C,CCvjGwzF,CAAG,CAAC3M,IAAI4M,GAAE,IAAA9U,IAAEL,IAAI96B,EAAE86B,GAAGl1B,EAAEqkC,YAAYnP,EAAC,IAAI,OAAO,gBAAgB0S,EAAE3U,SAAS,CAACn1B,MAAMqb,GAAG,gBAAgB4b,EAAE9B,SAAS,CAACn1B,MAAM,CAACumC,YAAYgG,EAAElG,aAAankC,EAAEmkC,aAAasD,OAAOjS,EAAEkS,kBAAkB/U,EAAEgV,iBAAiBlS,EAAE6B,KAAK+R,IAAIr2B,GAAG,CAAwhB,SAASoqB,GAAEpqB,EAAExM,EAAE7M,OAAE,GAAQ,IAAIwf,GAAE,SAAKpZ,GAAE,IAAAw1B,IAAE,CAACn7B,EAAEwnB,KAAK,GAAM,MAAHxnB,EAAQ,MAAM,CAACT,EAAE,MAAM,GAAa,iBAAHS,EAAY,MAAM,CAACA,EAAE,MAAM,GAAa,iBAAHA,EAAY,CAAC,IAAIwnB,EAAE,MAAM,CAACjoB,EAAE,MAAM,IAAIq4B,EAAE2D,GAAEv7B,EAAEwnB,GAAG,MAAM,CAACoQ,EAAE8C,IAAI,IAAI0T,EAAEpU,GAAEh6B,GAAG,CAAC,IAAI+oB,EAAEqlB,EAAE1mC,KAAI+yB,GAAGrR,OAAOoP,iBAAiBhR,GAAG0oB,iBAAiBzV,KAAI1b,EAAEsgB,uBAAsB,SAAS5E,IAAI1b,EAAE8e,UAAUpD,GAAG,IAAI/d,GAAE,EAAG,IAAI,IAAI9W,EAAEw1B,KAAKgT,EAAE5hB,UAAU,CAAC,IAAIjrB,EAAE6nB,OAAOoP,iBAAiBhR,GAAG0oB,iBAAiB9U,GAAG,GAAGrS,EAAEnjB,KAAKrE,EAAE,CAACwnB,EAAEnjB,GAAGrE,EAAEmb,GAAE,EAAG,KAAK,CAAC,CAAC,IAAIA,EAAE,OAAO,IAAIvY,EAAEo3B,GAAEv7B,EAAEwnB,GAAGoQ,IAAIzzB,IAAIu2B,EAAEv2B,GAAGyzB,EAAEzzB,EAAE,GAAE,CAAC,OAAO4a,EAAEwgB,SAAS,CAAC,MAAM,CAAChgC,EAAE,KAAI,IAAIwc,GAAE,cAAE,IAAIpW,EAAEiT,EAAExM,GAAG,IAAG,CAACwM,EAAExM,KAAKkc,EAAEvM,EAAEoN,IAAG,gBAAI,OAAO,QAAE,KAAK,IAAInpB,EAAEwnB,GAAG7hB,EAAEiT,EAAExM,GAAG,GAAG+c,EAAEnpB,GAAKwnB,EAAE,OAAOA,EAAE2B,EAAC,GAAG,CAACvQ,EAAExM,IAAIkc,CAAC,CAAC,SAAS0R,GAAEphB,GAAG,IAAIxM,EAAE,cAAc8X,KAAKtL,GAAG,GAAGxM,EAAE,CAAC,IAAI7M,EAAE6M,EAAE,GAAGjH,QAAQ,KAAK,IAAQ,IAAL5F,EAAO,MAAM,CAAC6M,EAAE,IAAI,IAAI2S,EAAE3S,EAAE,GAAG1L,MAAM,EAAEnB,GAAGiQ,OAAO7J,EAAEyG,EAAE,GAAG1L,MAAMnB,EAAE,GAAGiQ,OAAO,OAAO7J,EAAE,CAACoZ,KAAKib,GAAEr0B,IAAI,CAACoZ,EAAE,CAAC,MAAM,EAAE,CAAC,SAASwc,GAAE3iB,EAAExM,GAAG,IAAI7M,EAAE8pB,SAASC,cAAc,OAAOld,EAAE+jC,YAAY5wC,GAAGA,EAAEu5B,MAAMsX,YAAY,aAAa,MAAM,aAAa7wC,EAAEu5B,MAAMsX,YAAY,aAAax3B,EAAE,aAAa,IAAImG,EAAEvX,WAAW4hB,OAAOoP,iBAAiBj5B,GAAG8wC,YAAY,EAAE,OAAOjkC,EAAEkkC,YAAY/wC,GAAGwf,CAAC,qFCA5gJ,IAAInG,GAAE,wBAAE,GAAQ,SAASuQ,IAAI,OAAO,gBAAEvQ,EAAE,sCCAjG,SAASmD,EAAExc,GAAG,IAAIqZ,EAAErZ,EAAEgxC,cAAcxxB,EAAE,KAAK,KAAKnG,KAAKA,aAAa43B,sBAAsB53B,aAAa63B,oBAAoB1xB,EAAEnG,GAAGA,EAAEA,EAAE23B,cAAc,IAAInkC,EAAgD,MAA1C,MAAHwM,OAAQ,EAAOA,EAAEsZ,aAAa,aAAkB,QAAO9lB,IAAa,SAAW7M,GAAG,IAAIA,EAAE,OAAM,EAAG,IAAIqZ,EAAErZ,EAAEmxC,uBAAuB,KAAS,OAAJ93B,GAAU,CAAC,GAAGA,aAAa63B,kBAAkB,OAAM,EAAG73B,EAAEA,EAAE83B,sBAAsB,CAAC,OAAM,CAAE,CAApK1wC,CAAE+e,KAAM3S,CAAC,4HCAnK,IAAOpM,EAAHsoB,IAAGtoB,EAAkJsoB,GAAG,CAAC,GAAhJtoB,EAAE+9B,MAAM,GAAG,QAAQ/9B,EAAEA,EAAEy/B,SAAS,GAAG,WAAWz/B,EAAEA,EAAEw/B,KAAK,GAAG,OAAOx/B,EAAEA,EAAEi+B,KAAK,GAAG,OAAOj+B,EAAEA,EAAEq3B,SAAS,GAAG,WAAWr3B,EAAEA,EAAEo/B,QAAQ,GAAG,UAAUp/B,GAAW,SAASmE,EAAE4a,EAAExf,GAAG,IAAI6M,EAAE7M,EAAE+3B,eAAe,GAAGlrB,EAAEjM,QAAQ,EAAE,OAAO,KAAK,IAAI4b,EAAExc,EAAEg4B,qBAAqB7a,EAAK,MAAHX,EAAQA,GAAG,EAAE,OAAOgD,EAAEgW,OAAO,KAAK,EAAG,IAAI,IAAInc,EAAE,EAAEA,EAAExM,EAAEjM,SAASyY,EAAE,IAAIrZ,EAAEm4B,gBAAgBtrB,EAAEwM,GAAGA,EAAExM,GAAG,OAAOwM,EAAE,OAAOmD,EAAE,KAAK,GAAQ,IAALW,IAASA,EAAEtQ,EAAEjM,QAAQ,IAAI,IAAIyY,EAAE8D,EAAE,EAAE9D,GAAG,IAAIA,EAAE,IAAIrZ,EAAEm4B,gBAAgBtrB,EAAEwM,GAAGA,EAAExM,GAAG,OAAOwM,EAAE,OAAOmD,EAAE,KAAK,EAAG,IAAI,IAAInD,EAAE8D,EAAE,EAAE9D,EAAExM,EAAEjM,SAASyY,EAAE,IAAIrZ,EAAEm4B,gBAAgBtrB,EAAEwM,GAAGA,EAAExM,GAAG,OAAOwM,EAAE,OAAOmD,EAAE,KAAK,EAAG,IAAI,IAAInD,EAAExM,EAAEjM,OAAO,EAAEyY,GAAG,IAAIA,EAAE,IAAIrZ,EAAEm4B,gBAAgBtrB,EAAEwM,GAAGA,EAAExM,GAAG,OAAOwM,EAAE,OAAOmD,EAAE,KAAK,EAAG,IAAI,IAAInD,EAAE,EAAEA,EAAExM,EAAEjM,SAASyY,EAAE,GAAGrZ,EAAEo4B,UAAUvrB,EAAEwM,GAAGA,EAAExM,KAAK2S,EAAE+Y,GAAG,OAAOlf,EAAE,OAAOmD,EAAE,KAAK,EAAE,OAAO,KAAK,SAAvyB,SAAWgD,GAAG,MAAM,IAAI1e,MAAM,sBAAsB0e,EAAE,CAAyvBoK,CAAEpK,GAAG,sCCUhzB,SAAS4xB,EAAoCpU,GAC7C,IAAIqU,EACJ,MAAsB,qBAAXxnB,QAA8C,MAApBA,OAAOqb,aACsC,QAAzEmM,EAAkCxnB,OAAOqb,UAAyB,qBAAmD,IAApCmM,OAA6C,EAASA,EAAgCjM,OAAOrkB,MAAMukB,GAAQtI,EAAGva,KAAK6iB,EAAMA,WAAYtI,EAAGva,KAAKoH,OAAOqb,UAAUK,WAC5P,CACA,SAAS+L,EAAmCtU,GACxC,IAAIqU,EACJ,MAAyB,qBAAXxnB,QAA8C,MAApBA,OAAOqb,WAAoBlI,EAAGva,MAAgF,QAAzE4uB,EAAkCxnB,OAAOqb,UAAyB,qBAAmD,IAApCmM,OAA6C,EAASA,EAAgC1H,WAAa9f,OAAOqb,UAAUyE,SACtR,CACA,SAAS4H,IACL,OAAOD,EAAmC,QAC9C,CCRA,SAASE,EAA0C/zB,GAE/C,QAA6B,IAAzBA,EAAMg0B,iBAAwBh0B,EAAMi0B,aD2BjCN,EAAoC,aCvBa3zB,EAAMk0B,YAAmC,UAAfl0B,EAAMrd,MAAsC,IAAlBqd,EAAMm0B,QAC1F,IAAjBn0B,EAAMo0B,SAAiBp0B,EAAMk0B,YACxC,iCCrBA,MAAMG,EAA6CtrC,IAC/C,IAAIurC,EACJ,OAA0F,QAAlFA,EAA2B,OAAPvrC,QAAsB,IAAPA,OAAgB,EAASA,EAAGm/B,qBAAiD,IAAtBoM,EAA+BA,EAAoBjoB,QAAQ,EAE3JkoB,EAA6CxrC,IAC/C,GAAIA,GAAM,WAAYA,GAAMA,EAAGqjB,SAAWrjB,EAAI,OAAOA,EAErD,OADYsrC,EAA0CtrC,GAC3Co/B,aAAe/b,MAAM,iBCcpC,IAAIooB,EAAwC,KACxCC,EAAuC,IAAIC,IAC3CC,EAA4C,IAAInjB,IAChDojB,GAA4C,EAC5CC,GAAiD,EAErD,MAAMC,EAAiD,CACnD/R,KAAK,EACL7B,QAAQ,GAEZ,SAAS6T,EAA4CC,EAAUp5B,GAC3D,IAAK,IAAI/Y,KAAW4xC,EAAqC5xC,EAAQmyC,EAAUp5B,EAC/E,CAOA,SAASq5B,EAA0Cr5B,GAC/Cg5B,GAA4C,EAL5C,SAA0Ch5B,GAE1C,QAASA,EAAEs5B,UAAgB,KAAmBt5B,EAAEu5B,QAAUv5B,EAAE02B,SAAqB,YAAV12B,EAAE/W,KAA+B,UAAV+W,EAAE/W,KAA6B,SAAV+W,EAAE/W,IACzH,CAGQuwC,CAAiCx5B,KACjC44B,EAAwC,WACxCO,EAA4C,WAAYn5B,GAEhE,CACA,SAASy5B,EAAyCz5B,GAC9C44B,EAAwC,UACzB,cAAX54B,EAAEjZ,MAAmC,gBAAXiZ,EAAEjZ,OAC5BiyC,GAA4C,EAC5CG,EAA4C,UAAWn5B,GAE/D,CACA,SAAS05B,EAAuC15B,GACpC,EAAuBA,KAC3Bg5B,GAA4C,EAC5CJ,EAAwC,UAEhD,CACA,SAASe,EAAuC35B,GAIxCA,EAAE+F,SAAWyK,QAAUxQ,EAAE+F,SAAW0K,WAGnCuoB,GAA8CC,IAC/CL,EAAwC,UACxCO,EAA4C,UAAWn5B,IAE3Dg5B,GAA4C,EAC5CC,GAAiD,EACrD,CACA,SAASW,IAGLZ,GAA4C,EAC5CC,GAAiD,CACrD,CAGI,SAASY,EAA6CzmB,GACtD,GAAsB,qBAAX5C,QAA0BuoB,EAA0C7iB,IAAQ,EAAuB9C,IAAW,OACzH,MAAM0mB,EAAmB,EAAuB1mB,GAC1C2mB,EAAqB,EAAyB3mB,GAKpD,IAAI+I,EAAQ2d,EAAa5E,YAAY1uC,UAAU21B,MAC/C2d,EAAa5E,YAAY1uC,UAAU21B,MAAQ,WACvC6c,GAA4C,EAC5C7c,EAAMp0B,MAAMjC,KAAM0B,UACtB,EACAuyC,EAAehlB,iBAAiB,UAAWskB,GAA2C,GACtFU,EAAehlB,iBAAiB,QAASskB,GAA2C,GACpFU,EAAehlB,iBAAiB,QAAS2kB,GAAwC,GAGjFI,EAAa/kB,iBAAiB,QAAS4kB,GAAwC,GAC/EG,EAAa/kB,iBAAiB,OAAQ6kB,GAAwC,GAClD,qBAAjBI,cACPD,EAAehlB,iBAAiB,cAAe0kB,GAA0C,GACzFM,EAAehlB,iBAAiB,cAAe0kB,GAA0C,GACzFM,EAAehlB,iBAAiB,YAAa0kB,GAA0C,KAEvFM,EAAehlB,iBAAiB,YAAa0kB,GAA0C,GACvFM,EAAehlB,iBAAiB,YAAa0kB,GAA0C,GACvFM,EAAehlB,iBAAiB,UAAW0kB,GAA0C,IAGzFK,EAAa/kB,iBAAiB,gBAAgB,KAC1CklB,EAAkD7mB,EAAQ,GAC3D,CACC3qB,MAAM,IAEVswC,EAA0CtgB,IAAIqhB,EAAc,CACxD3d,MAAOA,GAEf,CACA,MAAM8d,EAAoD,CAAC7mB,EAAS8mB,KAChE,MAAMJ,EAAmB,EAAuB1mB,GAC1C2mB,EAAqB,EAAyB3mB,GAChD8mB,GAAcH,EAAe/kB,oBAAoB,mBAAoBklB,GACpEnB,EAA0ClvB,IAAIiwB,KACnDA,EAAa5E,YAAY1uC,UAAU21B,MAAQ4c,EAA0C7iB,IAAI4jB,GAAc3d,MACvG4d,EAAe/kB,oBAAoB,UAAWqkB,GAA2C,GACzFU,EAAe/kB,oBAAoB,QAASqkB,GAA2C,GACvFU,EAAe/kB,oBAAoB,QAAS0kB,GAAwC,GACpFI,EAAa9kB,oBAAoB,QAAS2kB,GAAwC,GAClFG,EAAa9kB,oBAAoB,OAAQ4kB,GAAwC,GACrD,qBAAjBI,cACPD,EAAe/kB,oBAAoB,cAAeykB,GAA0C,GAC5FM,EAAe/kB,oBAAoB,cAAeykB,GAA0C,GAC5FM,EAAe/kB,oBAAoB,YAAaykB,GAA0C,KAE1FM,EAAe/kB,oBAAoB,YAAaykB,GAA0C,GAC1FM,EAAe/kB,oBAAoB,YAAaykB,GAA0C,GAC1FM,EAAe/kB,oBAAoB,UAAWykB,GAA0C,IAE5FV,EAA0Ctf,OAAOqgB,GAAa,EAiBlE,SAASK,IACL,MAAiD,YAA1CvB,CACX,CAHwB,qBAAbnoB,UAdX,SAAmD2C,GAC/C,MAAM2mB,EAAqB,EAAyB3mB,GACpD,IAAI8mB,EAC8B,YAA9BH,EAAeK,WAA0BP,EAA6CzmB,IAEtF8mB,EAAe,KACXL,EAA6CzmB,EAAQ,EAEzD2mB,EAAehlB,iBAAiB,mBAAoBmlB,GAG5D,CAGqCG,GAyBrC,MAAMC,EAA0C,IAAIxB,IAAI,CACpD,WACA,QACA,QACA,QACA,OACA,QACA,SACA,SACA,UA4BJ,SAASyB,EAA0CxwC,EAAI+mB,EAAMnnB,GACzDkwC,KACA,EAAI,cAAkB,KAClB,IAAI5yC,EAAU,CAACmyC,EAAUp5B,MA1B7B,SAAoDw6B,EAAapB,EAAUp5B,GAC3E,IAAIy6B,EACJ,MAAMC,EAAsC,qBAAXlqB,OAA6B,EAA6B,OAANxQ,QAAoB,IAANA,OAAe,EAASA,EAAE+F,QAAQkW,iBAAmBA,iBAClJ0e,EAAyC,qBAAXnqB,OAA6B,EAA6B,OAANxQ,QAAoB,IAANA,OAAe,EAASA,EAAE+F,QAAQ60B,oBAAsBA,oBACxJC,EAAiC,qBAAXrqB,OAA6B,EAA6B,OAANxQ,QAAoB,IAANA,OAAe,EAASA,EAAE+F,QAAQmvB,YAAcA,YACxI4F,EAAmC,qBAAXtqB,OAA6B,EAA6B,OAANxQ,QAAoB,IAANA,OAAe,EAASA,EAAE+F,QAAQg1B,cAAgBA,cAElJ,SADAP,EAAcA,IAAsB,OAANx6B,QAAoB,IAANA,OAAe,EAASA,EAAE+F,kBAAmB20B,IAAsBJ,EAAwCzwB,IAAU,OAAN7J,QAAoB,IAANA,GAAmD,QAA1By6B,EAAYz6B,EAAE+F,cAAkC,IAAd00B,OAA5C,EAA4EA,EAAU1zC,QAAgB,OAANiZ,QAAoB,IAANA,OAAe,EAASA,EAAE+F,kBAAmB40B,IAA+B,OAAN36B,QAAoB,IAANA,OAAe,EAASA,EAAE+F,kBAAmB80B,IAAuB,OAAN76B,QAAoB,IAANA,OAAe,EAASA,EAAE+F,OAAOi1B,qBAClc,aAAb5B,GAA2Bp5B,aAAa86B,IAAmB5B,EAA+Cl5B,EAAE/W,KACxI,EAmBiBgyC,IAAuD,OAATtxC,QAA0B,IAATA,OAAkB,EAASA,EAAK6wC,aAAcpB,EAAUp5B,IAC5HjW,EAAGowC,IAA4C,EAGnD,OADAtB,EAAqCqC,IAAIj0C,GAClC,KACH4xC,EAAqCpf,OAAOxyB,EAAQ,CACvD,GAEF6pB,EACP,CC3NA,MAAMqqB,EAAgE,qBAAb1qB,SAA+B,EAAcP,gBAAkB,OCExH,SAASkrB,EAA0CrxC,GAC/C,MAAMo2B,GAAM,EAAI,UAAe,MAO/B,OANIgb,GAA2C,KAC3Chb,EAAInE,QAAUjyB,CAAE,GACjB,CACCA,KAGG,EAAI,gBAAoB,IAAI5C,KAC/B,MAAMoE,EAAI40B,EAAInE,QACd,OAAa,OAANzwB,QAAoB,IAANA,OAAe,EAASA,KAAKpE,EAAK,GACxD,GACP,CCZA,MAAMk0C,EACF,kBAAAC,GACI,OAAOx1C,KAAKy1C,YAAYC,gBAC5B,CACA,cAAAzW,GACIj/B,KAAK01C,kBAAmB,EACxB11C,KAAKy1C,YAAYxW,gBACrB,CACA,eAAAC,GACIl/B,KAAKy1C,YAAYvW,kBACjBl/B,KAAK21C,qBAAuB,KAAI,CACpC,CACA,oBAAAA,GACI,OAAO,CACX,CACA,OAAAC,GAAW,CACX,WAAAzrC,CAAYlJ,EAAMw0C,GACdz1C,KAAKy1C,YAAcA,EACnBz1C,KAAKigB,OAASw1B,EAAYx1B,OAC1BjgB,KAAKy/B,cAAgBgW,EAAYhW,cACjCz/B,KAAKshC,cAAgBmU,EAAYnU,cACjCthC,KAAK61C,QAAUJ,EAAYI,QAC3B71C,KAAK81C,WAAaL,EAAYK,WAC9B91C,KAAK01C,iBAAmBD,EAAYC,iBACpC11C,KAAK+1C,WAAaN,EAAYM,WAC9B/1C,KAAKuyC,UAAYkD,EAAYlD,UAC7BvyC,KAAKg2C,UAAYP,EAAYO,UAC7Bh2C,KAAKiB,KAAOA,CAChB,EAEJ,SAASg1C,EAA0CnU,GAC/C,IAAIoU,GAAW,EAAI,UAAe,CAC9B1U,WAAW,EACX3T,SAAU,OAIV,GAAwB,KACxB,MAAM3c,EAAQglC,EAAShgB,QACvB,MAAO,KACChlB,EAAM2c,WACN3c,EAAM2c,SAASyC,aACfpf,EAAM2c,SAAW,KACrB,CACH,GACF,IACH,IAAIsoB,EAAmB,GAAwBj8B,IAChC,OAAX4nB,QAA8B,IAAXA,GAA6BA,EAAO5nB,EAAE,IAG7D,OAAO,EAAI,gBAAqBA,IAK5B,GAAIA,EAAE+F,kBAAkBolB,mBAAqBnrB,EAAE+F,kBAAkBkW,kBAAoBjc,EAAE+F,kBAAkB60B,qBAAuB56B,EAAE+F,kBAAkBm2B,kBAAmB,CACnKF,EAAShgB,QAAQsL,WAAY,EAC7B,IAAIvhB,EAAS/F,EAAE+F,OACXo2B,EAAiBn8B,IACjBg8B,EAAShgB,QAAQsL,WAAY,EACzBvhB,EAAOgY,UACXke,EAAa,IAAIZ,EAA0C,OAAQr7B,IAE/Dg8B,EAAShgB,QAAQrI,WACjBqoB,EAAShgB,QAAQrI,SAASyC,aAC1B4lB,EAAShgB,QAAQrI,SAAW,KAChC,EAEJ5N,EAAOgP,iBAAiB,WAAYonB,EAAe,CAC/C1zC,MAAM,IAEVuzC,EAAShgB,QAAQrI,SAAW,IAAIyhB,kBAAiB,KAC7C,GAAI4G,EAAShgB,QAAQsL,WAAavhB,EAAOgY,SAAU,CAC/C,IAAIqe,EACyD,QAA5DA,EAA6BJ,EAAShgB,QAAQrI,gBAAqD,IAA/ByoB,GAAiDA,EAA2BhmB,aACjJ,IAAIimB,EAAkBt2B,IAAW0K,SAASyL,cAAgB,KAAOzL,SAASyL,cAC1EnW,EAAOu2B,cAAc,IAAIC,WAAW,OAAQ,CACxCnV,cAAeiV,KAEnBt2B,EAAOu2B,cAAc,IAAIC,WAAW,WAAY,CAC5CZ,SAAS,EACTvU,cAAeiV,IAEvB,KAEJL,EAAShgB,QAAQrI,SAASO,QAAQnO,EAAQ,CACtCzM,YAAY,EACZg8B,gBAAiB,CACb,aAGZ,IACD,CACC2G,GAER,CCzFA,SAASO,EAA0CpY,GAC/C,IAAMyB,WAAYA,EAAY8B,QAAS8U,EAAa7U,OAAQ8U,EAAYC,cAAeA,GAAkBvY,EACzG,MAAMwD,GAAS,EAAI,gBAAqB5nB,IACpC,GAAIA,EAAE+F,SAAW/F,EAAEulB,cAGf,OAFImX,GAAYA,EAAW18B,GACvB28B,GAAeA,GAAc,IAC1B,CACX,GACD,CACCD,EACAC,IAEEC,EAAuBb,EAA2CnU,GAClED,GAAU,EAAI,gBAAqB3nB,IAGrC,MAAMssB,EAAoB,EAAyBtsB,EAAE+F,QACjD/F,EAAE+F,SAAW/F,EAAEulB,eAAiB+G,EAAcpQ,gBAAkBlc,EAAE+F,SAC9D02B,GAAaA,EAAYz8B,GACzB28B,GAAeA,GAAc,GACjCC,EAAiB58B,GACrB,GACD,CACC28B,EACAF,EACAG,IAEJ,MAAO,CACHlX,WAAY,CACRiC,SAAU9B,IAAe4W,GAAeE,GAAiBD,GAAc/U,OAAU1hC,EACjF2hC,OAAS/B,IAAe6W,IAAcC,OAA0B12C,EAAT2hC,GAGnE,CCnCA,SAASiV,EAA0CzY,GAC/C,IAAMyB,WAAYA,EAAYiX,aAAcA,EAAcC,cAAeA,EAAeC,oBAAqBA,GAAwB5Y,EACjIptB,GAAQ,EAAI,UAAe,CAC3BimC,eAAe,IAEfrV,GAAS,EAAI,gBAAqB5nB,IAI9BhJ,EAAMglB,QAAQihB,gBAAkBj9B,EAAEulB,cAAc8B,SAASrnB,EAAEonB,iBAC3DpwB,EAAMglB,QAAQihB,eAAgB,EAC1BH,GAAcA,EAAa98B,GAC3Bg9B,GAAqBA,GAAoB,GACjD,GACD,CACCF,EACAE,EACAhmC,IAEA4lC,EAAuBb,EAA2CnU,GAClED,GAAU,EAAI,gBAAqB3nB,IAG9BhJ,EAAMglB,QAAQihB,eAAiBxsB,SAASyL,gBAAkBlc,EAAE+F,SACzDg3B,GAAeA,EAAc/8B,GAC7Bg9B,GAAqBA,GAAoB,GAC7ChmC,EAAMglB,QAAQihB,eAAgB,EAC9BL,EAAiB58B,GACrB,GACD,CACC+8B,EACAC,EACAJ,IAEJ,OAAI/W,EAAmB,CACnBqX,iBAAkB,CAEdvV,aAAS1hC,EACT2hC,YAAQ3hC,IAGT,CACHi3C,iBAAkB,CACdvV,QAASA,EACTC,OAAQA,GAGpB,CC7DA,SAASuV,EAA0C/Y,EAAQ,CAAC,GACxD,IAAMQ,UAAWA,GAAY,EAAO4V,YAAaA,EAAa4C,OAAQA,GAAWhZ,EAC7EptB,GAAQ,EAAI,UAAe,CAC3BswB,WAAW,EACX7B,eAAgBb,GAAiB,OAEhC0C,EAAW+V,IAAc,EAAI,aAAiB,IAC9CC,EAAqBC,IAAmB,EAAI,aAAiB,IAAIvmC,EAAMglB,QAAQsL,WAAatwB,EAAMglB,QAAQyJ,iBAC3G+X,GAAc,EAAI,gBAAoB,IAAID,EAAgBvmC,EAAMglB,QAAQsL,WAAatwB,EAAMglB,QAAQyJ,iBAAiB,IACpHkX,GAAgB,EAAI,gBAAqBrV,IACzCtwB,EAAMglB,QAAQsL,UAAYA,EAC1B+V,EAAW/V,GACXkW,GAAa,GACd,CACCA,IAEA,GAAiC/X,IACjCzuB,EAAMglB,QAAQyJ,eAAiBA,EAC/B+X,GAAa,GACd,GAAI,CACHhD,YAAaA,IAEjB,IAAM9U,WAAYA,GAAmB,EAAiB,CAClDG,WAAYuX,EACZT,cAAeA,KAEbO,iBAAkBA,GAAyB,EAAuB,CACpErX,YAAauX,EACbJ,oBAAqBL,IAEzB,MAAO,CACHrV,UAAWA,EACX7B,eAAgB6X,EAChB5X,WAAY0X,EAASF,EAAmBxX,EAEhD,qFCpBA,IAAI+X,GAAwD,EACxDC,EAAmC,EACvC,SAASC,IACLF,GAAwD,EAKxD/qB,YAAW,KACP+qB,GAAwD,CAAK,GAC9D,GACP,CACA,SAASG,EAA+C59B,GAC9B,UAAlBA,EAAEs4B,aAAyBqF,GACnC,CACA,SAASE,IACL,GAAwB,qBAAbptB,SAIX,MAH4B,qBAAjBupB,aAA8BvpB,SAASsE,iBAAiB,YAAa6oB,GAC3EntB,SAASsE,iBAAiB,WAAY4oB,GAC3CD,IACO,KACHA,IACIA,EAAmC,IACX,qBAAjB1D,aAA8BvpB,SAASuE,oBAAoB,YAAa4oB,GAC9EntB,SAASuE,oBAAoB,WAAY2oB,GAAyD,CAE/G,CACA,SAASG,EAA0C1Z,GAC/C,IAAM2Z,aAAcA,EAAcC,cAAeA,EAAeC,WAAYA,EAAYpY,WAAYA,GAAezB,GAC9GuB,EAAWuY,IAAc,EAAI,aAAiB,GAC/ClnC,GAAQ,EAAI,UAAe,CAC3B2uB,WAAW,EACXwY,2BAA2B,EAC3B7F,YAAa,GACbvyB,OAAQ,OACTiW,SACH,EAAI,aAAkB6hB,EAA8C,IACpE,IAAMjY,WAAYA,EAAYwY,gBAAiBA,IAAoB,EAAI,YAAgB,KACnF,IAAIC,EAAoB,CAACj6B,EAAOk0B,KAE5B,GADAthC,EAAMshC,YAAcA,EAChBzS,GAA8B,UAAhByS,GAA2BthC,EAAM2uB,YAAcvhB,EAAMmhB,cAAc8B,SAASjjB,EAAM2B,QAAS,OAC7G/O,EAAM2uB,WAAY,EAClB,IAAI5f,EAAS3B,EAAMmhB,cACnBvuB,EAAM+O,OAASA,EACXg4B,GAAcA,EAAa,CAC3Bh3C,KAAM,aACNgf,OAAQA,EACRuyB,YAAaA,IAEb0F,GAAeA,GAAc,GACjCE,GAAW,EAAK,EAEhBE,EAAkB,CAACh6B,EAAOk0B,KAG1B,GAFAthC,EAAMshC,YAAc,GACpBthC,EAAM+O,OAAS,KACK,UAAhBuyB,IAA4BthC,EAAM2uB,UAAW,OACjD3uB,EAAM2uB,WAAY,EAClB,IAAI5f,EAAS3B,EAAMmhB,cACf0Y,GAAYA,EAAW,CACvBl3C,KAAM,WACNgf,OAAQA,EACRuyB,YAAaA,IAEb0F,GAAeA,GAAc,GACjCE,GAAW,EAAM,EAEjBtY,EAAa,CAAC,EAqBlB,MApB4B,qBAAjBoU,cACPpU,EAAW0D,eAAkBtpB,IACrBy9B,GAA2E,UAAlBz9B,EAAEs4B,aAC/D+F,EAAkBr+B,EAAGA,EAAEs4B,YAAY,EAEvC1S,EAAW8D,eAAkB1pB,KACpB6lB,GAAc7lB,EAAEulB,cAAc8B,SAASrnB,EAAE+F,SAASq4B,EAAgBp+B,EAAGA,EAAEs4B,YAAY,IAG5F1S,EAAW0Y,aAAe,KACtBtnC,EAAMmnC,2BAA4B,CAAI,EAE1CvY,EAAW2D,aAAgBvpB,IAClBhJ,EAAMmnC,2BAA8BV,GAAuDY,EAAkBr+B,EAAG,SACrHhJ,EAAMmnC,2BAA4B,CAAK,EAE3CvY,EAAW+D,aAAgB3pB,KAClB6lB,GAAc7lB,EAAEulB,cAAc8B,SAASrnB,EAAE+F,SAASq4B,EAAgBp+B,EAAG,QAAQ,GAGnF,CACH4lB,WAAYA,EACZwY,gBAAiBA,EACpB,GACF,CACCL,EACAC,EACAC,EACApY,EACA7uB,IAYJ,OAVA,EAAI,cAAkB,KAGd6uB,GAAYuY,EAAgB,CAC5B7Y,cAAevuB,EAAM+O,QACtB/O,EAAMshC,YAAY,GAEtB,CACCzS,IAEG,CACHD,WAAYA,EACZD,UAAWA,EAEnB,sCCnIO,SAAS4Y,EAAeC,EAAWC,GACxC,QAAkBx4C,IAAdu4C,GAAgD,oBAAdA,EACpC,MAAM,IAAI/2C,MAAM,mDAAmDyD,QCHzCgc,EDG8Ds3B,ECFnF5yC,OAAOpF,UAAUqQ,SAASjP,KAAKsf,GAAQpf,MAAM,GAAI,IDE8C,UAAUoD,OAAOuzC,ICHlH,IAAuBv3B,CDK9B,qEECO,SAASw3B,IACd,IAAK,IAAIrR,EAAO7lC,UAAUD,OAAQo3C,EAAU,IAAI92C,MAAMwlC,GAAOC,EAAO,EAAGA,EAAOD,EAAMC,IAClFqR,EAAQrR,GAAQ9lC,UAAU8lC,GAE5B,IAAIsR,EAAQD,EAAQ7vC,KAAI,SAAU+vC,GAChC,OAVEnvC,GADkCs8B,EAWL6S,GAVjBnvC,KACdovC,EAAiB9S,EAAK+S,UAEjB,CAAC,qDAAsDrvC,EAAM,YADnC,IAAnBovC,GAAoCA,EACsC,aAAe,IAAIt3B,KAAK,IAJ3G,IAAiCwkB,EAClCt8B,EACFovC,CAUF,IAAGt3B,KAAK,MACR,OAAO,SAAUw3B,GACf,MAAO,CAACA,EAAS,sBAAsB9zC,OAAO0zC,IAAQ1yC,OAAOG,SAASmb,KAAK,OAC7E,CACF,+KChBA,SAASy3B,EAAQ74B,GAAkC,OAAO64B,EAAU,mBAAqBzvB,QAAU,iBAAmBA,OAAO0vB,SAAW,SAAU94B,GAAO,cAAcA,CAAK,EAAI,SAAUA,GAAO,OAAOA,GAAO,mBAAqBoJ,QAAUpJ,EAAInW,cAAgBuf,QAAUpJ,IAAQoJ,OAAOhpB,UAAY,gBAAkB4f,CAAK,EAAG64B,EAAQ74B,EAAM,CAE/U,SAAS+4B,IAAiS,OAApRA,EAAWvzC,OAAO8iB,OAAS9iB,OAAO8iB,OAAO9K,OAAS,SAAUmC,GAAU,IAAK,IAAI3e,EAAI,EAAGA,EAAII,UAAUD,OAAQH,IAAK,CAAE,IAAIwd,EAASpd,UAAUJ,GAAI,IAAK,IAAI6B,KAAO2b,EAAchZ,OAAOpF,UAAUwf,eAAepe,KAAKgd,EAAQ3b,KAAQ8c,EAAO9c,GAAO2b,EAAO3b,GAAU,CAAE,OAAO8c,CAAQ,EAAUo5B,EAASp3C,MAAMjC,KAAM0B,UAAY,CAClV,SAAS43C,EAAQl4B,EAAQm4B,GAAkB,IAAIxzC,EAAOD,OAAOC,KAAKqb,GAAS,GAAItb,OAAO0zC,sBAAuB,CAAE,IAAIC,EAAU3zC,OAAO0zC,sBAAsBp4B,GAASm4B,IAAmBE,EAAUA,EAAQrzC,QAAO,SAAUszC,GAAO,OAAO5zC,OAAO6zC,yBAAyBv4B,EAAQs4B,GAAKh6B,UAAY,KAAK3Z,EAAKzD,KAAKL,MAAM8D,EAAM0zC,EAAU,CAAE,OAAO1zC,CAAM,CACpV,SAAS6zC,EAAc35B,GAAU,IAAK,IAAI3e,EAAI,EAAGA,EAAII,UAAUD,OAAQH,IAAK,CAAE,IAAIwd,EAAS,MAAQpd,UAAUJ,GAAKI,UAAUJ,GAAK,CAAC,EAAGA,EAAI,EAAIg4C,EAAQxzC,OAAOgZ,IAAS,GAAIzW,SAAQ,SAAUlF,GAAO02C,EAAgB55B,EAAQ9c,EAAK2b,EAAO3b,GAAO,IAAK2C,OAAOg0C,0BAA4Bh0C,OAAOi0C,iBAAiB95B,EAAQna,OAAOg0C,0BAA0Bh7B,IAAWw6B,EAAQxzC,OAAOgZ,IAASzW,SAAQ,SAAUlF,GAAO2C,OAAOk0C,eAAe/5B,EAAQ9c,EAAK2C,OAAO6zC,yBAAyB76B,EAAQ3b,GAAO,GAAI,CAAE,OAAO8c,CAAQ,CACzf,SAAS45B,EAAgBv5B,EAAKnd,EAAK6B,GAA4L,OAAnL7B,EAC5C,SAAwB9C,GAAO,IAAI8C,EACnC,SAAsB82C,EAAOC,GAAQ,GAAuB,WAAnBf,EAAQc,IAAiC,OAAVA,EAAgB,OAAOA,EAAO,IAAIE,EAAOF,EAAMvwB,OAAO0wB,aAAc,QAAaj6C,IAATg6C,EAAoB,CAAE,IAAIhiC,EAAMgiC,EAAKr4C,KAAKm4C,EAAOC,GAAQ,WAAY,GAAqB,WAAjBf,EAAQhhC,GAAmB,OAAOA,EAAK,MAAM,IAAIpX,UAAU,+CAAiD,CAAE,OAAiB,WAATm5C,EAAoBn7B,OAASs7B,QAAQJ,EAAQ,CADnVK,CAAaj6C,EAAK,UAAW,MAAwB,WAAjB84C,EAAQh2C,GAAoBA,EAAM4b,OAAO5b,EAAM,CAD1Eo3C,CAAep3C,MAAiBmd,EAAOxa,OAAOk0C,eAAe15B,EAAKnd,EAAK,CAAE6B,MAAOA,EAAO0a,YAAY,EAAME,cAAc,EAAMD,UAAU,IAAkBW,EAAInd,GAAO6B,EAAgBsb,CAAK,CAKpO,IAAIk6B,EAAkB,CAC3BC,gBAAiB,oBACjBC,iBAAkB,sBAETC,EAAkB,CAC3BF,gBAAiB,SACjBC,iBAAkB,WAIpB,SAASE,EAAqB51C,GAC5B,OAAO,OAAOA,GAAOgR,QAAQ,IAAI6kC,OAAOL,EAAgBC,gBAAiB,KAAME,EAAgBF,iBAAiBzkC,QAAQ,IAAI6kC,OAAOL,EAAgBE,iBAAkB,KAAMC,EAAgBD,iBAC7L,CACA,SAASI,EAAgBb,GACvB,OAAI,OAAcA,IAAiC,kBAAhBA,EAAMj1C,MAChCc,OAAOC,KAAKk0C,GAAOj0C,QAAO,SAAU8J,EAAK3M,GAC9C,OAAOy2C,EAAcA,EAAc,CAAC,EAAG9pC,GAAM,CAAC,EAAG+pC,EAAgB,CAAC,EAAG12C,EAAK23C,EAAgBb,EAAM92C,KAClG,GAAG,CAAC,GAEFpB,MAAMoF,QAAQ8yC,GACTA,EAAMjxC,IAAI8xC,GAEZlB,EAAcA,EAAc,CAAC,EAAGK,GAAQ,CAAC,EAAG,CACjDj1C,MAAO41C,EAAqBX,EAAMj1C,QAEtC,CACO,SAAS+1C,EAAWC,GAgBzB,YAfuB76C,IAAnB66C,EAAKC,aAGPD,EAAOA,EAAKhyC,KAAI,SAAUk9B,GACxB,IAAIgV,EAAM7B,EAAS,CAAC,GAxC1B,SAAmC/4B,GAAO,GAAW,MAAPA,EAAa,MAAM,IAAIvf,UAAU,sBAAwBuf,EAAM,CAwC/E66B,CAA0BjV,GAAOA,IAOzD,OANIgV,EAAIE,mBACNF,EAAIE,iBAAmBN,EAAgBI,EAAIE,mBAEzCF,EAAIG,iBACNH,EAAIG,eAAiBP,EAAgBI,EAAIG,iBAEpCH,CACT,KACKD,WAAY,GAEZD,CACT,6FC/CA,IAAIM,EAAe,CACjB,IAAK,QACL,IAAK,OACL,IAAK,OACL,IAAK,SACL,IAAK,SAIHC,EAAqB,WACrBC,EAAwBX,OAAOU,EAAmBz8B,QAM/C,SAAS6K,EAAO3kB,GACrB,OAAOA,GAASw2C,EAAsBl4B,KAAKte,GAASA,EAAMgR,QAAQulC,GAAoB,SAAUE,GAC9F,OAAOH,EAAaG,EACtB,IAAKz2C,CACP,CAQA,IAAI02C,EAAiB,CACnB,QAAS,IACT,OAAQ,IACR,OAAQ,IACR,SAAU,IACV,QAAS,KAIPC,EAAmB,0BACnBC,EAAsBf,OAAOc,EAAiB78B,QAM3C,SAASuK,EAASrkB,GACvB,OAAOA,GAAS42C,EAAoBt4B,KAAKte,GAASA,EAAMgR,QAAQ2lC,GAAkB,SAAUF,GAC1F,OAAOC,EAAeD,EACxB,IAAKz2C,CACP,sCCtDO,SAAS62C,EAAc9C,GAC5B,MAAyB,cAAlBA,EAAO+C,MAChB,oECFA,SAAS3C,EAAQ74B,GAAkC,OAAO64B,EAAU,mBAAqBzvB,QAAU,iBAAmBA,OAAO0vB,SAAW,SAAU94B,GAAO,cAAcA,CAAK,EAAI,SAAUA,GAAO,OAAOA,GAAO,mBAAqBoJ,QAAUpJ,EAAInW,cAAgBuf,QAAUpJ,IAAQoJ,OAAOhpB,UAAY,gBAAkB4f,CAAK,EAAG64B,EAAQ74B,EAAM,CAsBxU,SAASy7B,EAAc/2C,GAC5B,IAXF,SAAsBA,GACpB,MAA0B,WAAnBm0C,EAAQn0C,IAAiC,OAAVA,CACxC,CASOg3C,CAAah3C,IAA4B,oBAjBhD,SAAgBA,GACd,OAAc,OAAVA,OACe7E,IAAV6E,EAAsB,qBAAuB,gBAE/Cc,OAAOpF,UAAUqQ,SAASjP,KAAKkD,EACxC,CAY8Bi3C,CAAOj3C,GACjC,OAAO,EAET,GAAqC,OAAjCc,OAAOo2C,eAAel3C,GACxB,OAAO,EAGT,IADA,IAAIm3C,EAAQn3C,EAC4B,OAAjCc,OAAOo2C,eAAeC,IAC3BA,EAAQr2C,OAAOo2C,eAAeC,GAEhC,OAAOr2C,OAAOo2C,eAAel3C,KAAWm3C,CAC1C,qEClCA,SAAShD,EAAQ74B,GAAkC,OAAO64B,EAAU,mBAAqBzvB,QAAU,iBAAmBA,OAAO0vB,SAAW,SAAU94B,GAAO,cAAcA,CAAK,EAAI,SAAUA,GAAO,OAAOA,GAAO,mBAAqBoJ,QAAUpJ,EAAInW,cAAgBuf,QAAUpJ,IAAQoJ,OAAOhpB,UAAY,gBAAkB4f,CAAK,EAAG64B,EAAQ74B,EAAM,iCAC/U,IAAI87B,EAAY,CAAC,SAAU,oBAAqB,oBAAqB,iBAAkB,+BAAgC,qBAAsB,iBAAkB,qBAAsB,gCAAiC,gBACtN,SAAS9C,EAAQl4B,EAAQm4B,GAAkB,IAAIxzC,EAAOD,OAAOC,KAAKqb,GAAS,GAAItb,OAAO0zC,sBAAuB,CAAE,IAAIC,EAAU3zC,OAAO0zC,sBAAsBp4B,GAASm4B,IAAmBE,EAAUA,EAAQrzC,QAAO,SAAUszC,GAAO,OAAO5zC,OAAO6zC,yBAAyBv4B,EAAQs4B,GAAKh6B,UAAY,KAAK3Z,EAAKzD,KAAKL,MAAM8D,EAAM0zC,EAAU,CAAE,OAAO1zC,CAAM,CACpV,SAAS6zC,EAAc35B,GAAU,IAAK,IAAI3e,EAAI,EAAGA,EAAII,UAAUD,OAAQH,IAAK,CAAE,IAAIwd,EAAS,MAAQpd,UAAUJ,GAAKI,UAAUJ,GAAK,CAAC,EAAGA,EAAI,EAAIg4C,EAAQxzC,OAAOgZ,IAAS,GAAIzW,SAAQ,SAAUlF,GAAO02C,EAAgB55B,EAAQ9c,EAAK2b,EAAO3b,GAAO,IAAK2C,OAAOg0C,0BAA4Bh0C,OAAOi0C,iBAAiB95B,EAAQna,OAAOg0C,0BAA0Bh7B,IAAWw6B,EAAQxzC,OAAOgZ,IAASzW,SAAQ,SAAUlF,GAAO2C,OAAOk0C,eAAe/5B,EAAQ9c,EAAK2C,OAAO6zC,yBAAyB76B,EAAQ3b,GAAO,GAAI,CAAE,OAAO8c,CAAQ,CACzf,SAAS45B,EAAgBv5B,EAAKnd,EAAK6B,GAA4L,OAAnL7B,EAC5C,SAAwB9C,GAAO,IAAI8C,EACnC,SAAsB82C,EAAOC,GAAQ,GAAuB,WAAnBf,EAAQc,IAAiC,OAAVA,EAAgB,OAAOA,EAAO,IAAIE,EAAOF,EAAMvwB,OAAO0wB,aAAc,QAAaj6C,IAATg6C,EAAoB,CAAE,IAAIhiC,EAAMgiC,EAAKr4C,KAAKm4C,EAAOC,GAAQ,WAAY,GAAqB,WAAjBf,EAAQhhC,GAAmB,OAAOA,EAAK,MAAM,IAAIpX,UAAU,+CAAiD,CAAE,OAAiB,WAATm5C,EAAoBn7B,OAASs7B,QAAQJ,EAAQ,CADnVK,CAAaj6C,EAAK,UAAW,MAAwB,WAAjB84C,EAAQh2C,GAAoBA,EAAM4b,OAAO5b,EAAM,CAD1Eo3C,CAAep3C,MAAiBmd,EAAOxa,OAAOk0C,eAAe15B,EAAKnd,EAAK,CAAE6B,MAAOA,EAAO0a,YAAY,EAAME,cAAc,EAAMD,UAAU,IAAkBW,EAAInd,GAAO6B,EAAgBsb,CAAK,CAG3O,SAAS+7B,EAAyBv9B,EAAQyB,GAAY,GAAc,MAAVzB,EAAgB,MAAO,CAAC,EAAG,IAAkE3b,EAAK7B,EAAnE2e,EACzF,SAAuCnB,EAAQyB,GAAY,GAAc,MAAVzB,EAAgB,MAAO,CAAC,EAAG,IAA2D3b,EAAK7B,EAA5D2e,EAAS,CAAC,EAAOO,EAAa1a,OAAOC,KAAK+Y,GAAqB,IAAKxd,EAAI,EAAGA,EAAIkf,EAAW/e,OAAQH,IAAO6B,EAAMqd,EAAWlf,GAAQif,EAAS9Z,QAAQtD,IAAQ,IAAa8c,EAAO9c,GAAO2b,EAAO3b,IAAQ,OAAO8c,CAAQ,CADhNq8B,CAA8Bx9B,EAAQyB,GAAuB,GAAIza,OAAO0zC,sBAAuB,CAAE,IAAI+C,EAAmBz2C,OAAO0zC,sBAAsB16B,GAAS,IAAKxd,EAAI,EAAGA,EAAIi7C,EAAiB96C,OAAQH,IAAO6B,EAAMo5C,EAAiBj7C,GAAQif,EAAS9Z,QAAQtD,IAAQ,GAAkB2C,OAAOpF,UAAU87C,qBAAqB16C,KAAKgd,EAAQ3b,KAAgB8c,EAAO9c,GAAO2b,EAAO3b,GAAQ,CAAE,OAAO8c,CAAQ,CAI3e,IA0BIw8B,EAA0B,SAAiC7hB,EAAMiK,GACnE,OAAOjK,EAAKtwB,mBAAmB,CAC7BzC,mBAAoBg9B,EAAMh9B,mBAAmB7B,QAAO,SAAU2B,EAAQ6B,GACpE,IAAI5F,EClCH,SAAmBiL,EAAOmQ,GAC/B,IAAKjd,MAAMoF,QAAQ0H,GACjB,OAAQ,EAEV,IAAK,IAAIvN,EAAI,EAAGA,EAAIuN,EAAMpN,OAAQH,IAChC,GAAI0d,EAAWnQ,EAAMvN,IACnB,OAAOA,EAGX,OAAQ,CACV,CDwBkB+R,CAAU1L,GAAQ,SAAU+wB,GACtC,OAAOA,EAAE9uB,OAASJ,EAAMI,IAC1B,IACA,IAAe,IAAXhG,EACF,OAAO+D,EAAOvC,OAAOoE,GAEvB,IAAIkzC,EAAa/0C,EAAO3F,QAExB,OADA06C,EAAWz5C,OAAOW,EAAO,EAAG4F,GACrBkzC,CACT,GAAG9hB,EAAK/yB,qBAEZ,EA0CW80C,EAAwB,WACjC,IAAK,IAAIpV,EAAO7lC,UAAUD,OAAQ+C,EAAa,IAAIzC,MAAMwlC,GAAOC,EAAO,EAAGA,EAAOD,EAAMC,IACrFhjC,EAAWgjC,GAAQ9lC,UAAU8lC,GAE/B,OAAOhjC,EAAWwB,QAAO,SAAU40B,EAAMiK,GACvC,IAAI+X,EAnBiC,SAA4ChiB,EAAMiK,GACzF,OAAOjK,EAAKtwB,mBAAmB,CAC7BnC,8BAA+ByxC,EAAcA,EAAc,CAAC,EAAGhf,EAAKzyB,+BAAgC08B,EAAM18B,gCAE9G,CAe8C00C,CAAmCjiB,EAAMiK,GAE/EiY,EA9CkB,SAA6BliB,EAAMiK,GAC3D,OAAOA,EAAM38B,eAAelC,QAAO,SAAU0yB,EAAG1zB,GAC9C,OAAO0zB,EAAE3rB,iBAAiB/H,EAC5B,GAAG41B,EACL,CA0C+BmiB,CADIN,EAAwBG,EAAqC/X,GACnBA,GACrEmY,EA3BsB,SAAiCpiB,EAAMiK,GACnE,OAAOjK,EAAKtwB,mBAAmB,CAC7BrC,mBAAoB2xC,EAAcA,EAAc,CAAC,EAAGhf,EAAK3yB,oBAAqB48B,EAAM58B,qBAExF,CAuBmCg1C,CAAwBH,EAAsBjY,GACzEqY,EAjCgC,SAA2CtiB,EAAMiK,GACvF,OAAOjK,EAAKtwB,mBAAmB,CAC7BtC,6BAA8B4xC,EAAcA,EAAc,CAAC,EAAGhf,EAAK5yB,8BAA+B68B,EAAM78B,+BAE5G,CA6B6Cm1C,CAAkCH,EAA0BnY,GACjGuY,EAvCkB,SAA6BxiB,EAAMiK,GAC3D,OAAOjK,EAAKtwB,mBAAmB,CAC7BvC,eAAgB6xC,EAAcA,EAAc,CAAC,EAAGhf,EAAK7yB,gBAAiB88B,EAAM98B,iBAEhF,CAmC+Bs1C,CAAoBH,EAAoCrY,GAC/EyY,EA7CoB,SAA+B1iB,EAAMiK,GAC/D,OAAOjK,EAAKtwB,mBAAmB,CAC7BxC,kBAAmB8xC,EAAcA,EAAc,CAAC,EAAGhf,EAAK9yB,mBAAoB+8B,EAAM/8B,oBAEtF,CAyCiCy1C,CAAsBH,EAAsBvY,GACrE2Y,EAzEqB,SAAgC5iB,EAAMiK,GACjE,OAAOA,EAAMj9B,kBAAkB5B,QAAO,SAAU0yB,EAAG9uB,GACjD,OAAO8uB,EAAElsB,oBAAoB5C,EAC/B,GAAGgxB,EACL,CAqEkC6iB,CAAuBH,EAAwBzY,GACzE6Y,EAtBgB,SAA2B9iB,EAAMiK,GACvD,IAAI8Y,EAAoB,GAAGv4C,OAAOw1B,EAAK+iB,cAAcv4C,OAAOy/B,EAAM8Y,cAAcv3C,OAAOG,SEpF1EH,QAAO,SAAUpB,EAAOpB,EAAOwE,GAC1C,OAAOA,EAAK3B,QAAQzB,KAAWpB,CACjC,IFmFA,OAAI+5C,EAAal8C,OAAS,EACjBm5B,EAAKtwB,mBAAmB,CAC7BqzC,aAAcA,IAGX/iB,CACT,CAc6BgjB,CAAkBJ,EAAyB3Y,GAChEgZ,EAhFU,SAAqBjjB,EAAMiK,GAC3C,OAAOA,EAAMl9B,OAAO3B,QAAO,SAAU0yB,EAAG9uB,GACtC,OAAO8uB,EAAEnsB,SAAS3C,EACpB,GAAGgxB,EACL,CA4EuBkjB,CAAYJ,EAAoB7Y,GACnD,OAjGgB,SAAuBjK,EAAMiK,GAClCA,EAAMl9B,OACGk9B,EAAMj9B,kBACNi9B,EAAM/8B,kBACT+8B,EAAM98B,eACQ88B,EAAM78B,6BAChB68B,EAAM58B,mBACV48B,EAAM38B,eACF28B,EAAMh9B,mBACKg9B,EAAM18B,8BACvB08B,EAAM8Y,aATvB,IAUEI,EAAO1B,EAAyBxX,EAAOuX,GACzC,OAAOxhB,EAAKtwB,mBAAmByzC,EACjC,CAoFWC,CAAcH,EAAchZ,EACrC,GACF,sCG9GO,SAASoZ,IAAQ,oECAjB,SAASC,EAAeC,EAAuBnsC,EAAQosC,GAC5D,IAAI3gC,EAASzL,EAAOqsC,YACpB,MAAO,CACLD,QAASA,EACT3gC,OAAQA,EACRzL,OAAQA,EACRmsC,sBAAuBA,EACvBjtC,MAAOuM,EAAOvM,MACdotC,YAAaH,EAAsBG,YACnCC,gBAAiBJ,EAAsBI,gBACvCC,UAAWxsC,EAAOwsC,UAClBC,cAAe,GACfC,eAAgB,CACdC,gBAAkD,YAAjCR,EAAsBS,QAEzCA,OAAQT,EAAsBS,OAC9Bp9C,MAAO28C,EAAsB38C,MAEjC,CACO,SAASq9C,EAAiBV,EAAuBnsC,GACtD,IAAIkB,EAAUlB,EAAO8sC,aACjBrhC,EAASzL,EAAOqsC,YACpB,MAAO,CACL5gC,OAAQA,EACRzL,OAAQA,EACRmsC,sBAAuBA,EACvBjrC,QAASA,EACTurC,cAAezsC,EAAO+sC,mBACtB7tC,MAAOgC,EAAUA,EAAQyC,OAAS8H,EAAOvM,MACzCotC,YAAaH,EAAsBG,YACnCC,gBAAiBJ,EAAsBI,gBACvCC,UAAWxsC,EAAOwsC,UAClBE,eAAgB,CACdC,gBAAkD,YAAjCR,EAAsBS,QAEzCA,OAAQT,EAAsBS,OAC9Bp9C,MAAO28C,EAAsB38C,MAEjC,4FCtCO,SAASw9C,EAAiB3lB,GAC/B,OAAO4lB,KAAKC,mBAAmBluC,KAAKC,UAAUooB,IAChD,+JCFA,SAAS8f,EAAQ74B,GAAkC,OAAO64B,EAAU,mBAAqBzvB,QAAU,iBAAmBA,OAAO0vB,SAAW,SAAU94B,GAAO,cAAcA,CAAK,EAAI,SAAUA,GAAO,OAAOA,GAAO,mBAAqBoJ,QAAUpJ,EAAInW,cAAgBuf,QAAUpJ,IAAQoJ,OAAOhpB,UAAY,gBAAkB4f,CAAK,EAAG64B,EAAQ74B,EAAM,CAC/U,IAAI87B,EAAY,CAAC,2BACjB,SAAS9C,EAAQl4B,EAAQm4B,GAAkB,IAAIxzC,EAAOD,OAAOC,KAAKqb,GAAS,GAAItb,OAAO0zC,sBAAuB,CAAE,IAAIC,EAAU3zC,OAAO0zC,sBAAsBp4B,GAASm4B,IAAmBE,EAAUA,EAAQrzC,QAAO,SAAUszC,GAAO,OAAO5zC,OAAO6zC,yBAAyBv4B,EAAQs4B,GAAKh6B,UAAY,KAAK3Z,EAAKzD,KAAKL,MAAM8D,EAAM0zC,EAAU,CAAE,OAAO1zC,CAAM,CACpV,SAAS6zC,EAAc35B,GAAU,IAAK,IAAI3e,EAAI,EAAGA,EAAII,UAAUD,OAAQH,IAAK,CAAE,IAAIwd,EAAS,MAAQpd,UAAUJ,GAAKI,UAAUJ,GAAK,CAAC,EAAGA,EAAI,EAAIg4C,EAAQxzC,OAAOgZ,IAAS,GAAIzW,SAAQ,SAAUlF,GAAO02C,EAAgB55B,EAAQ9c,EAAK2b,EAAO3b,GAAO,IAAK2C,OAAOg0C,0BAA4Bh0C,OAAOi0C,iBAAiB95B,EAAQna,OAAOg0C,0BAA0Bh7B,IAAWw6B,EAAQxzC,OAAOgZ,IAASzW,SAAQ,SAAUlF,GAAO2C,OAAOk0C,eAAe/5B,EAAQ9c,EAAK2C,OAAO6zC,yBAAyB76B,EAAQ3b,GAAO,GAAI,CAAE,OAAO8c,CAAQ,CACzf,SAAS45B,EAAgBv5B,EAAKnd,EAAK6B,GAA4L,OAAnL7B,EAC5C,SAAwB9C,GAAO,IAAI8C,EACnC,SAAsB82C,EAAOC,GAAQ,GAAuB,WAAnBf,EAAQc,IAAiC,OAAVA,EAAgB,OAAOA,EAAO,IAAIE,EAAOF,EAAMvwB,OAAO0wB,aAAc,QAAaj6C,IAATg6C,EAAoB,CAAE,IAAIhiC,EAAMgiC,EAAKr4C,KAAKm4C,EAAOC,GAAQ,WAAY,GAAqB,WAAjBf,EAAQhhC,GAAmB,OAAOA,EAAK,MAAM,IAAIpX,UAAU,+CAAiD,CAAE,OAAiB,WAATm5C,EAAoBn7B,OAASs7B,QAAQJ,EAAQ,CADnVK,CAAaj6C,EAAK,UAAW,MAAwB,WAAjB84C,EAAQh2C,GAAoBA,EAAM4b,OAAO5b,EAAM,CAD1Eo3C,CAAep3C,MAAiBmd,EAAOxa,OAAOk0C,eAAe15B,EAAKnd,EAAK,CAAE6B,MAAOA,EAAO0a,YAAY,EAAME,cAAc,EAAMD,UAAU,IAAkBW,EAAInd,GAAO6B,EAAgBsb,CAAK,CAG3O,SAAS6+B,EAAmBn4B,GAAO,OAInC,SAA4BA,GAAO,GAAIjlB,MAAMoF,QAAQ6f,GAAM,OAAOo4B,EAAkBp4B,EAAM,CAJhDq4B,CAAmBr4B,IAG7D,SAA0Bs4B,GAAQ,GAAsB,qBAAX51B,QAAmD,MAAzB41B,EAAK51B,OAAO0vB,WAA2C,MAAtBkG,EAAK,cAAuB,OAAOv9C,MAAM8wB,KAAKysB,EAAO,CAHxFC,CAAiBv4B,IAEtF,SAAqC8B,EAAG02B,GAAU,IAAK12B,EAAG,OAAQ,GAAiB,kBAANA,EAAgB,OAAOs2B,EAAkBt2B,EAAG02B,GAAS,IAAI3+C,EAAIiF,OAAOpF,UAAUqQ,SAASjP,KAAKgnB,GAAG9mB,MAAM,GAAI,GAAc,WAANnB,GAAkBioB,EAAE3e,cAAatJ,EAAIioB,EAAE3e,YAAYP,MAAM,GAAU,QAAN/I,GAAqB,QAANA,EAAa,OAAOkB,MAAM8wB,KAAK/J,GAAI,GAAU,cAANjoB,GAAqB,2CAA2CyiB,KAAKziB,GAAI,OAAOu+C,EAAkBt2B,EAAG02B,EAAS,CAFjUC,CAA4Bz4B,IAC1H,WAAgC,MAAM,IAAIjmB,UAAU,uIAAyI,CAD3D2+C,EAAsB,CAKxJ,SAASN,EAAkBp4B,EAAK5lB,IAAkB,MAAPA,GAAeA,EAAM4lB,EAAIvlB,UAAQL,EAAM4lB,EAAIvlB,QAAQ,IAAK,IAAIH,EAAI,EAAGwe,EAAO,IAAI/d,MAAMX,GAAME,EAAIF,EAAKE,IAAKwe,EAAKxe,GAAK0lB,EAAI1lB,GAAI,OAAOwe,CAAM,CAClL,SAASu8B,EAAyBv9B,EAAQyB,GAAY,GAAc,MAAVzB,EAAgB,MAAO,CAAC,EAAG,IAAkE3b,EAAK7B,EAAnE2e,EACzF,SAAuCnB,EAAQyB,GAAY,GAAc,MAAVzB,EAAgB,MAAO,CAAC,EAAG,IAA2D3b,EAAK7B,EAA5D2e,EAAS,CAAC,EAAOO,EAAa1a,OAAOC,KAAK+Y,GAAqB,IAAKxd,EAAI,EAAGA,EAAIkf,EAAW/e,OAAQH,IAAO6B,EAAMqd,EAAWlf,GAAQif,EAAS9Z,QAAQtD,IAAQ,IAAa8c,EAAO9c,GAAO2b,EAAO3b,IAAQ,OAAO8c,CAAQ,CADhNq8B,CAA8Bx9B,EAAQyB,GAAuB,GAAIza,OAAO0zC,sBAAuB,CAAE,IAAI+C,EAAmBz2C,OAAO0zC,sBAAsB16B,GAAS,IAAKxd,EAAI,EAAGA,EAAIi7C,EAAiB96C,OAAQH,IAAO6B,EAAMo5C,EAAiBj7C,GAAQif,EAAS9Z,QAAQtD,IAAQ,GAAkB2C,OAAOpF,UAAU87C,qBAAqB16C,KAAKgd,EAAQ3b,KAAgB8c,EAAO9c,GAAO2b,EAAO3b,GAAQ,CAAE,OAAO8c,CAAQ,CAI3e,IAAI0/B,GAAY,OAAoC,CAClD/1C,KAAM,iBAOR,SAASg2C,EAAsBniC,EAAQyoB,GACrC,IAAIh1B,EAAQg1B,EAAKh1B,MACfgI,EAAcgtB,EAAKhtB,YACnB2mC,EAAW3Z,EAAK2Z,SACd3uC,IAAUuM,EAAOvM,QACnBuM,EAAOvM,MAAQA,EACfuM,EAAOzc,KAAK,SAAU,CACpBkQ,MAAOuM,EAAOvM,MACdgC,QAASuK,EAAOtZ,YAChB+U,YAAaA,EACb2mC,SAAUA,IAGhB,CACA,SAASC,EAAuBjH,EAASkH,GACvC,IAAIC,EAAiBt+C,UAAUD,OAAS,QAAsBtB,IAAjBuB,UAAU,GAAmBA,UAAU,GAAK,CAAC,EAC1F,OAAOm3C,EAAQ7yC,QAAO,SAAUo4C,EAASrF,GACvC,OAAI,EAAA8C,EAAA,GAAc9C,GACTqF,EAEJrF,EAAOkH,kBAAqBlH,EAAOmH,eAGpCnH,EAAOkH,iBACFlH,EAAOkH,iBAAiB7B,EAAS2B,GAEnChH,EAAOmH,eAAe9B,EAAS2B,GAL7B3B,CAMX,GAAG4B,EACL,CACA,SAASG,EAAgCtH,EAASuH,GAChD,IAAIC,EAA0BD,EAA8BC,wBAC1DtC,EAAO1B,EAAyB+D,EAA+BhE,GACjE,OAAOvD,EAAQzyC,QAAO,SAAU2yC,GAC9B,QAAQ,EAAA8C,EAAA,GAAc9C,EACxB,IAAG/yC,QAAO,SAAUkL,EAAO6nC,GACzB,OAAKA,EAAOuH,0BAGLvH,EAAOuH,0BAA0BpvC,EAAO6sC,GAFtC7sC,CAGX,GAAGmvC,EACL,CACA,SAASE,EAAqB1H,GAC5B,IAAI2H,EAAe3H,EAAQzyC,OAAOy1C,EAAA,GACN,IAAxB2E,EAAa/+C,QAGjB++C,EAAan4C,SAAQ,SAAU0wC,GAC7B,IAAI0H,EAAe1H,EAAOsF,YAC1BuB,EAAsBa,EAAc,CAClCvvC,MAAOuvC,EAAavvC,MAAMf,YAC1B+I,aAAa,IAEfqnC,EAAqBxH,EAAO2H,aAC9B,GACF,CACA,SAASC,EAAgC9H,GAEvC,OADmBA,EAAQzyC,OAAOy1C,EAAA,GACd71C,QAAO,SAAUy4C,EAAevoB,GAClD,OAAOuoB,EAAcr5C,OAAOnD,MAAMw8C,EAAe,CAAC,CAChDmC,QAAS1qB,EAAQ2qB,aACjB3tC,QAASgjB,EAAQ4oB,aACjBrhC,OAAQyY,EAAQmoB,cACfj5C,OAAO+5C,EAAmBwB,EAAgCzqB,EAAQwqB,gBACvE,GAAG,GACL,CACA,IAuYA,EAvYY,SAAeI,GACzB,QAAqB3gD,IAAjB2gD,QAAyD3gD,IAA3B2gD,EAAavlC,UAC7C,MAAM,IAAI5Z,MAAMg+C,EAAU,wCAE5B,IAAIpkC,EAAYulC,EAAavlC,UAC3BwlC,EAAwBD,EAAaF,QACrCA,OAAoC,IAA1BG,EAAmCxlC,EAAYwlC,EACvDC,EAAe,GACfC,EAAe,CAAC,EAChBC,EAA6B,KAC7BC,EAAc,KACd1jC,EAAS,KACTpD,EAAgB,KAChB+mC,EAA4B,KAChC,MAAO,CACLtF,OAAQ,YACRuF,aAAc,YACdC,aAAc,WACZ,OAAO/lC,CACT,EACAslC,WAAY,WACV,OAAOD,CACT,EACAvC,UAAW,WACT,OAAO5gC,CACT,EACAqhC,WAAY,WACV,IAAIyC,EACJ,OAA2C,QAApCA,EAAiBlnC,SAA8C,IAAnBknC,GAA6BA,EAAep9C,aAO/FkW,EAAclW,YAAYwR,OAAS8H,EAAOvM,MACnCmJ,EAAclW,aAR+F,IAStH,EACAq9C,iBAAkB,WAChB,OAAOJ,CACT,EACArC,iBAAkB,WAChB,IAAI0C,EAAezhD,KAAK0hD,YAIxB,OAAOf,EADcc,EAAeA,EAAaf,aAAe,CAAC1gD,MAEnE,EACA0hD,UAAW,WACT,OAAOP,CACT,EACA3C,UAAW,SAAmBmD,GAC5B,MAAyB,oBAAdA,EACFT,EAA2BU,WAAW/H,EAAgB,CAAC,EAAG+G,EAASe,EAAUV,KAE/EC,EAA2BU,WAAW/H,EAAgB,CAAC,EAAG+G,EAASd,EAAuBkB,EAAc,CAC7Ga,iBAAkBF,EAClBlkC,OAAQA,KAEZ,EACAijC,WAAY,WACV,OAAOM,CACT,EACAc,WAAY,SAAoBjJ,GAC9B,IAAIkJ,EAAQ/hD,KACZ,IAAK+B,MAAMoF,QAAQ0xC,GACjB,MAAM,IAAIl3C,MAAMg+C,EAAU,yDAE5B,GAAI9G,EAAQj3B,MAAK,SAAUm3B,GACzB,MAA8B,oBAAhBA,EAAOiJ,MAAgD,oBAAlBjJ,EAAOkJ,MAC5D,IACE,MAAM,IAAItgD,MAAMg+C,EAAU,sEAgC5B,OA9BAqB,EAAeA,EAAa57C,OAAOyzC,GAC/BqI,GAA8B36C,QAAQsyC,EAAQp3C,UAChDm+C,EAAsBniC,EAAQ,CAC5BvM,MAAOivC,EAAgCa,EAAc,CACnD5C,QAAS6C,EACTZ,wBAAyB5iC,EAAOvM,QAElC2uC,SAAUoB,IAMZpI,EAAQxwC,SAAQ,SAAU0wC,GACpBA,EAAOmJ,gBAETC,EAAiB,CACf7D,YAFgBvF,EAAOmJ,eAAehB,EAA2B5C,YAAYyD,EAAMlB,eAAiB,CAAC,GAAG,OAAeK,EAA4Ba,EAAOb,EAA2BkB,kBAGrLjE,sBAAuB+C,EACvBlvC,OAAQ+vC,GAGd,IACAlJ,EAAQxwC,SAAQ,SAAU0wC,GACpBA,EAAOiJ,MACTjJ,EAAOiJ,MAAK,OAAed,EAA4Ba,EAAOb,EAA2BkB,iBAE7F,IACAlB,EAA2BmB,kBAEtBriD,IACT,EACAsiD,cAAe,SAAuBzJ,GACpC,IAAI0J,EAASviD,KACb,IAAK+B,MAAMoF,QAAQ0xC,GACjB,MAAM,IAAIl3C,MAAMg+C,EAAU,4DAE5B,GAAI9G,EAAQj3B,MAAK,SAAUm3B,GACzB,MAAiC,oBAAnBA,EAAOlY,OACvB,IACE,MAAM,IAAIl/B,MAAMg+C,EAAU,sDAK5B,GAHAqB,EAAeA,EAAa56C,QAAO,SAAU2yC,GAC3C,OAAoC,IAA7BF,EAAQpyC,QAAQsyC,EACzB,IACImI,GAA8B36C,QAAQsyC,EAAQp3C,QAAS,CACzD,IAAI+gD,EAAa3J,EAAQ7yC,QAAO,SAAUkL,EAAO6nC,GAO/C,OALWA,EAAOlY,QAAQ,CACxBpjB,OAAQA,EACRvM,MAAOA,EACPc,OAAQuwC,KAEKrxC,CACjB,GAAGuM,EAAOvM,OACV+vC,EAAenB,EAAuBkB,EAAc,CAClDa,iBAAkBW,EAClB/kC,OAAQA,IAEVA,EAAOd,SAASwjC,EAAgCa,EAAc,CAC5D5C,QAAS6C,EACTZ,wBAAyBmC,KAEvBxB,EAAav/C,QACfy/C,EAA2BmB,gBAE/B,CACA,OAAOriD,IACT,EACAgiD,KAAM,SAAcS,GAClB,IACEC,EADEC,EAAS3iD,KAETm+C,EAAwBsE,EAAMtE,sBAChCnsC,EAASywC,EAAMzwC,OACfosC,EAAUqE,EAAMrE,QAClB,GAAe,OAAX3gC,EAAJ,CAKAyjC,EAA6B/C,EAC7BgD,EAAcnvC,EACdivC,EAAe7C,EAAQwC,IAAY,CAAC,EAKpC,IAAI58C,EAAam6C,EAAsBn6C,WACnCQ,EAAa27C,EAAgCa,EAAc,CAC7D5C,QAAS6C,EACTZ,wBAAyB,IAAI,mBAAqC,CAChEz8C,MAAO2X,OAOXkC,EAAS,EAAoB,CAAC,EAAGjZ,EAAWZ,MAAOY,IAK5C4U,OAAS,WACd,OAAI+kC,EAAsByE,eACxBzE,EAAsByE,cAAc,CAClCxE,QAASD,EAAsB0E,UAAU5C,iBAAiB,CAAC,GAC3D6C,WAAY,SAAoBnB,GAC9B,OAAOxD,EAAsB2E,WAAWnB,GAAW,EACrD,IAKK39C,GAEFA,EAAWoV,QACpB,EACAqE,EAAOslC,qCAAuC,WAC5C,OAAO/+C,EAAWoV,QACpB,EAGAqE,EAAO3C,qBAAuB,SAAUrP,EAAW4G,EAAY0I,EAAcC,GAC3E,IAAI9J,EAAQuM,EAAOvM,MAAM5G,mBAAmB0Q,GAC5C,OAAOhX,EAAW8W,qBAAqBrP,EAAW4G,EAAY0I,EAAc7J,EAC9E,EACAmJ,EAAgBrW,EAAW0a,QAAO,WAChC,OAAOi+B,EAAA,EAAsB16C,WAAM,EAAQk9C,ECnS5C,SAAiCjpB,GAGtC,IAFA,IAAIlkB,EAASkkB,EAAQwrB,YACjBpkC,EAAS,CAAC4Y,EAAQmoB,YAAYntC,OAChB,OAAXc,GACLsL,EAAS,CAACtL,EAAOqsC,YAAYntC,OAAO9L,OAAOkY,GAC3CtL,EAASA,EAAO0vC,YAElB,OAAOpkC,CACT,CD2RsE0lC,CAAwBL,IACxF,IACA,IAAIM,EAA0F,QAAnEP,EAAwBvE,EAAsB+E,uBAAuD,IAA1BR,OAAmC,EAASA,EAAsB1iD,KAAK6gD,cAC7K,GAAIoC,EAAqB,CAGvB,IAAI/vC,EAAU,IAAI,gBAAkC,IAAI,mBAAqC+vC,EAAoB/xC,OAAQ+xC,EAAoB/vC,SAC7ImH,EAAclW,YAAc+O,EAC5BuK,EAAOtZ,YAAc+O,CACvB,CAMAuK,EAAO/a,GAAG,UAAU,SAAUygD,GACVA,EAAMjqC,aAEtBqnC,EAAqBS,EAEzB,IACA3mC,EAAc3X,GAAG,UAAU,WAKzBy7C,EAAsBiF,uBAOxB,IACA/oC,EAAc3X,GAAG,UAAU,SAAU2gD,GACnC,IAAInwC,EAAUmwC,EAAMnwC,QAIpBirC,EAAsBmF,iBAMtB7lC,EAAOtZ,YAAc+O,EACrBkuC,EAAwC,OAAZluC,QAAgC,IAAZA,OAAqB,EAASA,EAAQyC,MACxF,IAKAqrC,EAAa34C,SAAQ,SAAU0wC,GACzBA,EAAOmJ,gBAETC,EAAiB,CACf7D,YAFgBvF,EAAOmJ,eAAe/D,EAAsBG,YAAYqE,EAAO9B,eAAiB,CAAC,GAAG,OAAe1C,EAAuBwE,EAAQvE,IAGlJD,sBAAuBA,EACvBnsC,OAAQ2wC,GAGd,IACA3B,EAAa34C,SAAQ,SAAU0wC,GAKzBA,EAAOiJ,MACTjJ,EAAOiJ,MAAK,OAAe7D,EAAuBwE,EAAQvE,GAE9D,IAQA3gC,EAAO/a,GAAG,UAAU,SAAU4b,GAC5B,IAAIpN,EAAQoN,EAAMpN,MACd2uC,EAAWvhC,EAAMuhC,SACrBoB,EAAenB,EAAuBkB,EAAc,CAClDa,iBAAkB3wC,EAClBuM,OAAQA,GACPoiC,GAAY,CAAC,GAIX1B,EAAsByE,eACzBzE,EAAsBoF,uBAE1B,IACIN,GAIF9E,EAAsBmF,gBAjJxB,CAmJF,EACArB,OAAQ,SAAgBuB,GACtB,IAAIC,EAASzjD,KACTm+C,EAAwBqF,EAAMrF,sBAGG,UAAjCA,EAAsBS,SAAuBT,EAAsBn6C,WAAW4a,sBAAwBwiC,GACxG3jC,EAAOd,SAASykC,GAKlB,IAAIsC,EAAkB1jD,KAAK8+C,aAAekC,EAAeA,EAAa56C,OAAOy1C,EAAA,GAC7E6H,EAAgBr7C,SAAQ,SAAU0wC,GAC5BA,EAAOmJ,gBAETC,EAAiB,CACf7D,YAFgBvF,EAAOmJ,eAAe/D,EAAsBG,YAAYmF,EAAO5C,eAAiB,CAAC,GAAG,OAAiB1C,EAAuBsF,IAG5ItF,sBAAuBA,EACvBnsC,OAAQyxC,GAGd,IACAC,EAAgBr7C,SAAQ,SAAU0wC,GAQ5BA,EAAOkJ,QACTlJ,EAAOkJ,QAAO,OAAiB9D,EAAuBsF,GAE1D,GACF,EACA5iB,QAAS,WACP,IACE8iB,EACAC,EAFEC,EAAS7jD,KAGbghD,EAAa34C,SAAQ,SAAU0wC,GACzBA,EAAOlY,SAOTkY,EAAOlY,QAAQ,CACbpjB,OAAQA,EACRvM,MAAOuM,EAAOvM,MACdc,OAAQ6xC,GAGd,IACA3C,EAA6B,KAC7BC,EAAc,KACS,QAAtBwC,EAAUlmC,SAAgC,IAAZkmC,GAA8BA,EAAQzgD,qBACrEua,EAAS,KAC6B,QAArCmmC,EAAkBvpC,SAA+C,IAApBupC,GAAsCA,EAAgBv/C,SACpGgW,EAAgB,IAClB,EACA4lC,iBAAkB,SAA0B7B,GAC1C,OAAO4C,EAAa56C,OAAOy1C,EAAA,GAAe71C,QAAO,SAAU89C,EAAiBC,GAC1E,OAAOA,EAAW9D,iBAAiB6D,EACrC,GAAGlK,EAAcA,EAAc,CAAC,EAAGwE,GAAU,CAAC,EAAGvE,EAAgB,CAAC,EAAG+G,EAAShH,EAAcA,EAAc,CAAC,EAAGwE,EAAQwC,IAAWK,KACnI,EACAf,eAAgB,SAAwB9B,GAEtC,OAAOp+C,KAAKigD,iBAAiB7B,EAC/B,EACAkC,0BAA2B,SAAmCuB,EAAkBmC,GAC9E,IAAI5F,EAAU4F,EAAM5F,QACpB,OAAO+B,EAAgCa,EAAc,CACnD5C,QAASA,EACTiC,wBAAyBwB,GAE7B,EACAoC,eAAgB,WACdhD,EAAenB,EAAuBkB,EAAc,CAClDa,iBAAkB7hD,KAAKq+C,YAAYntC,MACnCuM,OAAQzd,KAAKq+C,aACZ4C,EACL,EACAiD,gBAAiB,SAAyBC,GACxC,IAAIC,EAA2C,oBAAjBD,EAA8BA,EAAalD,GAAgBkD,EACzFjD,EAA2B4B,YAAW,SAAU5xC,GAC9C,OAAO0oC,EAAcA,EAAc,CAAC,EAAG1oC,GAAQ,CAAC,EAAG2oC,EAAgB,CAAC,EAAG+G,EAASwD,GAClF,GACF,EAEJ,EAEA,SAASjC,EAAiBkC,GACxB,IAAI/F,EAAc+F,EAAM/F,YACtBH,EAAwBkG,EAAMlG,sBAC9BnsC,EAASqyC,EAAMryC,OACbsyC,EAAkBtyC,EAASA,EAAO6uC,aAAe1C,EAAsB0E,UAAUhC,aACrF1C,EAAsBG,YAAc1E,EAAcA,EAAc,CAAC,EAAGuE,EAAsBG,aAAc,CAAC,EAAGzE,EAAgB,CAAC,EAAGyK,EAAiB1K,EAAcA,EAAc,CAAC,EAAGuE,EAAsBG,YAAYgG,IAAmBhG,IACxO,gIExeA,SAASnF,EAAQ74B,GAAkC,OAAO64B,EAAU,mBAAqBzvB,QAAU,iBAAmBA,OAAO0vB,SAAW,SAAU94B,GAAO,cAAcA,CAAK,EAAI,SAAUA,GAAO,OAAOA,GAAO,mBAAqBoJ,QAAUpJ,EAAInW,cAAgBuf,QAAUpJ,IAAQoJ,OAAOhpB,UAAY,gBAAkB4f,CAAK,EAAG64B,EAAQ74B,EAAM,CAC/U,SAASg5B,EAAQl4B,EAAQm4B,GAAkB,IAAIxzC,EAAOD,OAAOC,KAAKqb,GAAS,GAAItb,OAAO0zC,sBAAuB,CAAE,IAAIC,EAAU3zC,OAAO0zC,sBAAsBp4B,GAASm4B,IAAmBE,EAAUA,EAAQrzC,QAAO,SAAUszC,GAAO,OAAO5zC,OAAO6zC,yBAAyBv4B,EAAQs4B,GAAKh6B,UAAY,KAAK3Z,EAAKzD,KAAKL,MAAM8D,EAAM0zC,EAAU,CAAE,OAAO1zC,CAAM,CACpV,SAAS6zC,EAAc35B,GAAU,IAAK,IAAI3e,EAAI,EAAGA,EAAII,UAAUD,OAAQH,IAAK,CAAE,IAAIwd,EAAS,MAAQpd,UAAUJ,GAAKI,UAAUJ,GAAK,CAAC,EAAGA,EAAI,EAAIg4C,EAAQxzC,OAAOgZ,IAAS,GAAIzW,SAAQ,SAAUlF,GAAO02C,EAAgB55B,EAAQ9c,EAAK2b,EAAO3b,GAAO,IAAK2C,OAAOg0C,0BAA4Bh0C,OAAOi0C,iBAAiB95B,EAAQna,OAAOg0C,0BAA0Bh7B,IAAWw6B,EAAQxzC,OAAOgZ,IAASzW,SAAQ,SAAUlF,GAAO2C,OAAOk0C,eAAe/5B,EAAQ9c,EAAK2C,OAAO6zC,yBAAyB76B,EAAQ3b,GAAO,GAAI,CAAE,OAAO8c,CAAQ,CACzf,SAAS45B,EAAgBv5B,EAAKnd,EAAK6B,GAA4L,OAAnL7B,EAC5C,SAAwB9C,GAAO,IAAI8C,EACnC,SAAsB82C,EAAOC,GAAQ,GAAuB,WAAnBf,EAAQc,IAAiC,OAAVA,EAAgB,OAAOA,EAAO,IAAIE,EAAOF,EAAMvwB,OAAO0wB,aAAc,QAAaj6C,IAATg6C,EAAoB,CAAE,IAAIhiC,EAAMgiC,EAAKr4C,KAAKm4C,EAAOC,GAAQ,WAAY,GAAqB,WAAjBf,EAAQhhC,GAAmB,OAAOA,EAAK,MAAM,IAAIpX,UAAU,+CAAiD,CAAE,OAAiB,WAATm5C,EAAoBn7B,OAASs7B,QAAQJ,EAAQ,CADnVK,CAAaj6C,EAAK,UAAW,MAAwB,WAAjB84C,EAAQh2C,GAAoBA,EAAM4b,OAAO5b,EAAM,CAD1Eo3C,CAAep3C,MAAiBmd,EAAOxa,OAAOk0C,eAAe15B,EAAKnd,EAAK,CAAE6B,MAAOA,EAAO0a,YAAY,EAAME,cAAc,EAAMD,UAAU,IAAkBW,EAAInd,GAAO6B,EAAgBsb,CAAK,CAU3O,IAAIq/B,GAAY,OAAoC,CAClD/1C,KAAM,YACNqvC,WAAW,IAEb,SAASsL,EAA2BrzC,EAAO4vC,GAIzC,OAAO5vC,EAAM5G,mBAAmBxE,OAAOC,KAAK+6C,EAAae,kBAAkB77C,QAAO,SAAU8J,EAAK3M,GAC/F,OAAOy2C,EAAcA,EAAc,CAAC,EAAG9pC,GAAM,CAAC,EAAG+pC,EAAgB,CAAC,EAAG12C,OAAKhD,GAC5E,GAAG,CAAC,GACN,CACA,IAyEA,EAzEuB,WACrB,IAAIqkD,EAAW9iD,UAAUD,OAAS,QAAsBtB,IAAjBuB,UAAU,GAAmBA,UAAU,GAAKu8C,EAAA,EAC/EwG,EAAY/iD,UAAUD,OAAS,QAAsBtB,IAAjBuB,UAAU,GAAmBA,UAAU,GAAKu8C,EAAA,EACpF,OAAO,SAAU6C,GACf,IAAKA,KAAiB,EAAA/E,EAAA,GAAc+E,EAAae,kBAC/C,MAAM,IAAIlgD,MAAMg+C,EAAU,qDAE5B,IAAI+E,EAAiB,CAAC,EActB,MAAO,CACL5I,OAAQ,gBACRkG,KAAM,SAAc2C,GAClB,IAAIxG,EAAwBwG,EAAYxG,sBACxCqG,EAAS5K,EAAcA,EAAc,CAAC,EAAG55C,KAAK4kD,qBAAqBD,IAAe,CAAC,EAAG,CACpFxG,sBAAuBA,KACrB,EACN,EACA8D,OAAQ,SAAgB4C,GACtB,IAAI1G,EAAwB0G,EAAc1G,sBAC1CqG,EAAS5K,EAAcA,EAAc,CAAC,EAAG55C,KAAK4kD,qBAAqBC,IAAiB,CAAC,EAAG,CACtF1G,sBAAuBA,KACrB,EACN,EACAtd,QAAS,SAAiBqF,GACxB,IAAIh1B,EAAQg1B,EAAKh1B,MAEjB,OADAuzC,IACOF,EAA2BrzC,EAAO4vC,EAC3C,EACAoB,eAAgB,SAAwB5D,EAAauG,GACnD,IAAIC,EACAC,EAAoB/kD,KAAK4kD,qBAAqBC,GAClD,OAAOjL,EAAcA,EAAc,CAAC,EAAG0E,GAAc,CAAC,EAAG,CACvD0G,UAAWpL,EAAcA,EAAc,CAAC,EAAGmL,GAAoB,CAAC,EAAG,CACjEjE,aAAclH,EAAcA,EAAc,CAAC,EAAGmL,EAAkBjE,cAAe,CAAC,EAAG,CACjFe,kBAAkB,EAAAlF,EAAA,GAAsB,IAAI,mBAAyF,QAAnDmI,EAAwBxG,EAAY0G,iBAAiD,IAA1BF,OAAmC,EAASA,EAAsBhE,aAAae,kBAAmB,IAAI,mBAAqCkD,EAAkBjE,aAAae,mBAAmBryC,sBAIlV,EACAo1C,qBAAsB,SAA8BnC,GAClD,IAAIhlC,EAASglC,EAAMhlC,OAInB,OAHKinC,EAAeO,SAClBP,EAAeO,OA9CrB,SAAgBxnC,GACd,OAAO,SAAUokC,GAEf,IAAIqD,EAAcX,EAA2B9mC,EAAOvM,MAAO4vC,GACvDqE,GAAuB,EAAAxI,EAAA,GAAsBuI,EAAa,IAAI,mBAAqCrD,IAGvGf,EAAae,iBAAmBA,EAGhCpkC,EAAOd,SAASwoC,GAAsB/rC,QACxC,CACF,CAkC8B6rC,CAAOxnC,IAE1B,CACLwnC,OAAQP,EAAeO,OACvBnE,aAAcA,EAElB,EACAR,0BAA2B,SAAmCpvC,EAAOiyC,GACnE,IAAI/E,EAAU+E,EAAM/E,QACpB,OAAO,EAAAzB,EAAA,GAAsBzrC,EAAO,IAAI,mBAAqC0oC,EAAcA,EAAc,CAAC,EAAGwE,EAAQ4G,WAAYlE,EAAae,mBAChJ,EACA5B,iBAAkB,SAA0B7B,GAC1C,OAAOxE,EAAcA,EAAc,CAAC,EAAGwE,GAAU,CAAC,EAAG,CACnD4G,UAAWpL,EAAcA,EAAc,CAAC,EAAGwE,EAAQ4G,WAAYlE,EAAae,mBAEhF,EAEJ,CACF,aChGO,SAASuD,EAAU9mB,GAIxB,OCHK,SAAsBA,EAAO+mB,IAC3B,EAAAC,EAAA,GAAa,EAAkB,CACpCzD,iBAAkBvjB,GACjB+mB,EACL,CDJEE,CAAajnB,EAAO,CAClB+iB,aAAc,kBAET,IACT,kIENA,SAASlI,EAAQ74B,GAAkC,OAAO64B,EAAU,mBAAqBzvB,QAAU,iBAAmBA,OAAO0vB,SAAW,SAAU94B,GAAO,cAAcA,CAAK,EAAI,SAAUA,GAAO,OAAOA,GAAO,mBAAqBoJ,QAAUpJ,EAAInW,cAAgBuf,QAAUpJ,IAAQoJ,OAAOhpB,UAAY,gBAAkB4f,CAAK,EAAG64B,EAAQ74B,EAAM,CAExU,IAAIklC,EAA6B,WAkBjC,SAASC,IACd,OAlBF,SAAmB77C,GACjB,GAA4E,YAAnD,qBAAb+gB,SAA2B,YAAcwuB,EAAQxuB,YAAsD,kBAApBA,SAAS+6B,OAKxG,IAFA,IAAI7+B,EAAS,GAAGzhB,OAAOwE,EAAM,KACzB+7C,EAAUh7B,SAAS+6B,OAAO90C,MAAM,KAC3BtP,EAAI,EAAGA,EAAIqkD,EAAQlkD,OAAQH,IAAK,CAEvC,IADA,IAAIokD,EAASC,EAAQrkD,GACO,MAArBokD,EAAO9/B,OAAO,IACnB8/B,EAASA,EAAOE,UAAU,GAE5B,GAA+B,IAA3BF,EAAOj/C,QAAQogB,GACjB,OAAO6+B,EAAOE,UAAU/+B,EAAOplB,OAAQikD,EAAOjkD,OAElD,CAEF,CAESokD,CAAUL,EACnB,CCjBO,SAASM,EAAmBxe,GACjC,IAKE3Y,GALSjtB,UAAUD,OAAS,QAAsBtB,IAAjBuB,UAAU,GAAmBA,UAAU,GAAK,CAC3EitB,SAAU,WAEV,IAEcA,SAElB,MAAsB,qBAAXjE,OACFiE,IAIF2Y,EAAS,CACd5c,OAAQA,QAEZ,gBCrBA,SAAS,EAAQpK,GAAkC,OAAO,EAAU,mBAAqBoJ,QAAU,iBAAmBA,OAAO0vB,SAAW,SAAU94B,GAAO,cAAcA,CAAK,EAAI,SAAUA,GAAO,OAAOA,GAAO,mBAAqBoJ,QAAUpJ,EAAInW,cAAgBuf,QAAUpJ,IAAQoJ,OAAOhpB,UAAY,gBAAkB4f,CAAK,EAAG,EAAQA,EAAM,CAC/U,SAASg5B,EAAQl4B,EAAQm4B,GAAkB,IAAIxzC,EAAOD,OAAOC,KAAKqb,GAAS,GAAItb,OAAO0zC,sBAAuB,CAAE,IAAIC,EAAU3zC,OAAO0zC,sBAAsBp4B,GAASm4B,IAAmBE,EAAUA,EAAQrzC,QAAO,SAAUszC,GAAO,OAAO5zC,OAAO6zC,yBAAyBv4B,EAAQs4B,GAAKh6B,UAAY,KAAK3Z,EAAKzD,KAAKL,MAAM8D,EAAM0zC,EAAU,CAAE,OAAO1zC,CAAM,CACpV,SAAS6zC,EAAc35B,GAAU,IAAK,IAAI3e,EAAI,EAAGA,EAAII,UAAUD,OAAQH,IAAK,CAAE,IAAIwd,EAAS,MAAQpd,UAAUJ,GAAKI,UAAUJ,GAAK,CAAC,EAAGA,EAAI,EAAIg4C,EAAQxzC,OAAOgZ,IAAS,GAAIzW,SAAQ,SAAUlF,GAAO02C,EAAgB55B,EAAQ9c,EAAK2b,EAAO3b,GAAO,IAAK2C,OAAOg0C,0BAA4Bh0C,OAAOi0C,iBAAiB95B,EAAQna,OAAOg0C,0BAA0Bh7B,IAAWw6B,EAAQxzC,OAAOgZ,IAASzW,SAAQ,SAAUlF,GAAO2C,OAAOk0C,eAAe/5B,EAAQ9c,EAAK2C,OAAO6zC,yBAAyB76B,EAAQ3b,GAAO,GAAI,CAAE,OAAO8c,CAAQ,CACzf,SAAS45B,EAAgBv5B,EAAKnd,EAAK6B,GAA4L,OAAnL7B,EAC5C,SAAwB9C,GAAO,IAAI8C,EACnC,SAAsB82C,EAAOC,GAAQ,GAAuB,WAAnB,EAAQD,IAAiC,OAAVA,EAAgB,OAAOA,EAAO,IAAIE,EAAOF,EAAMvwB,OAAO0wB,aAAc,QAAaj6C,IAATg6C,EAAoB,CAAE,IAAIhiC,EAAMgiC,EAAKr4C,KAAKm4C,EAAOC,GAAQ,WAAY,GAAqB,WAAjB,EAAQ/hC,GAAmB,OAAOA,EAAK,MAAM,IAAIpX,UAAU,+CAAiD,CAAE,OAAiB,WAATm5C,EAAoBn7B,OAASs7B,QAAQJ,EAAQ,CADnVK,CAAaj6C,EAAK,UAAW,MAAwB,WAAjB,EAAQ8C,GAAoBA,EAAM4b,OAAO5b,EAAM,CAD1Eo3C,CAAep3C,MAAiBmd,EAAOxa,OAAOk0C,eAAe15B,EAAKnd,EAAK,CAAE6B,MAAOA,EAAO0a,YAAY,EAAME,cAAc,EAAMD,UAAU,IAAkBW,EAAInd,GAAO6B,EAAgBsb,CAAK,CAG3O,SAASylC,EAAe/+B,EAAK1lB,GAAK,OAGlC,SAAyB0lB,GAAO,GAAIjlB,MAAMoF,QAAQ6f,GAAM,OAAOA,CAAK,CAH3Bg/B,CAAgBh/B,IAEzD,SAA+BA,EAAK1lB,GAAK,IAAI2kD,EAAK,MAAQj/B,EAAM,KAAO,oBAAsB0C,QAAU1C,EAAI0C,OAAO0vB,WAAapyB,EAAI,cAAe,GAAI,MAAQi/B,EAAI,CAAE,IAAIC,EAAIC,EAAIC,EAAIC,EAAIC,EAAO,GAAIC,GAAK,EAAIl7B,GAAK,EAAI,IAAM,GAAI+6B,GAAMH,EAAKA,EAAGnkD,KAAKklB,IAAMw/B,KAAM,IAAMllD,EAAG,CAAE,GAAIwE,OAAOmgD,KAAQA,EAAI,OAAQM,GAAK,CAAI,MAAO,OAASA,GAAML,EAAKE,EAAGtkD,KAAKmkD,IAAKQ,QAAUH,EAAKhkD,KAAK4jD,EAAGlhD,OAAQshD,EAAK7kD,SAAWH,GAAIilD,GAAK,GAAK,CAAE,MAAO3kD,GAAOypB,GAAK,EAAI86B,EAAKvkD,CAAK,CAAE,QAAU,IAAM,IAAK2kD,GAAM,MAAQN,EAAGS,SAAWL,EAAKJ,EAAGS,SAAU5gD,OAAOugD,KAAQA,GAAK,MAAQ,CAAE,QAAU,GAAIh7B,EAAI,MAAM86B,CAAI,CAAE,CAAE,OAAOG,CAAM,CAAE,CAF1gBK,CAAsB3/B,EAAK1lB,IAAMm+C,EAA4Bz4B,EAAK1lB,IACnI,WAA8B,MAAM,IAAIP,UAAU,4IAA8I,CADvD6lD,EAAoB,CAI7J,SAASzH,EAAmBn4B,GAAO,OAInC,SAA4BA,GAAO,GAAIjlB,MAAMoF,QAAQ6f,GAAM,OAAOo4B,EAAkBp4B,EAAM,CAJhDq4B,CAAmBr4B,IAG7D,SAA0Bs4B,GAAQ,GAAsB,qBAAX51B,QAAmD,MAAzB41B,EAAK51B,OAAO0vB,WAA2C,MAAtBkG,EAAK,cAAuB,OAAOv9C,MAAM8wB,KAAKysB,EAAO,CAHxFC,CAAiBv4B,IAAQy4B,EAA4Bz4B,IAC1H,WAAgC,MAAM,IAAIjmB,UAAU,uIAAyI,CAD3D2+C,EAAsB,CAExJ,SAASD,EAA4B32B,EAAG02B,GAAU,GAAK12B,EAAL,CAAgB,GAAiB,kBAANA,EAAgB,OAAOs2B,EAAkBt2B,EAAG02B,GAAS,IAAI3+C,EAAIiF,OAAOpF,UAAUqQ,SAASjP,KAAKgnB,GAAG9mB,MAAM,GAAI,GAAiE,MAAnD,WAANnB,GAAkBioB,EAAE3e,cAAatJ,EAAIioB,EAAE3e,YAAYP,MAAgB,QAAN/I,GAAqB,QAANA,EAAoBkB,MAAM8wB,KAAK/J,GAAc,cAANjoB,GAAqB,2CAA2CyiB,KAAKziB,GAAWu+C,EAAkBt2B,EAAG02B,QAAzG,CAA7O,CAA+V,CAG/Z,SAASJ,EAAkBp4B,EAAK5lB,IAAkB,MAAPA,GAAeA,EAAM4lB,EAAIvlB,UAAQL,EAAM4lB,EAAIvlB,QAAQ,IAAK,IAAIH,EAAI,EAAGwe,EAAO,IAAI/d,MAAMX,GAAME,EAAIF,EAAKE,IAAKwe,EAAKxe,GAAK0lB,EAAI1lB,GAAI,OAAOwe,CAAM,CAGlL,IAAI+mC,EAA2B,QAC3BC,EAAuB,gDAAgD1hD,OAAOyhD,EAA0B,gCA0N5G,SAASE,EAAuBpjD,GAC9B,IACEqjD,EAAcjB,GADEpiD,EAAOG,SAAW,IAAI8M,MAAM,KAAK5H,IAAIqxC,QACZ,GACzC4M,EAAQD,EAAY,GACpBE,EAAQF,EAAY,GAQtB,OALSC,GAAS,GACG,IAAVA,GAAeC,GAAS,GACb,IAAVD,GAAeC,GAAS,EAItC,eCzPA,SAASC,EAAqBtO,EAASsF,EAAuB9kB,GAC5D,IAAIsrB,GAAc,OAAexG,EAAuBA,EAAsB0E,UAAW1E,EAAsBiE,iBAC/GvJ,EAAQxwC,SAAQ,SAAU0wC,GACxB,IAAI+H,EAAe,CAAC,EACpB,GAAI/H,EAAO6L,qBAAsB,CAC/B,IAAItG,EAAcvF,EAAO6L,qBAAqBD,GAC1CrG,GAAeA,EAAYwC,eAE7BA,EAAexC,EAAYwC,aAE/B,CAGA,IAAIv5C,EAASzB,OAAOC,KAAK+6C,GAAc16C,QAAO,SAAUjD,GACtD,YAA6BhD,IAAtB2gD,EAAa39C,EACtB,IACAk2B,EAAQwf,QAAQv2C,KAAK,CACnBrB,KAAM83C,EAAO+C,OACbsL,WAAYrO,EAAOsI,aACnB95C,OAAQA,IAEY,cAAlBwxC,EAAO+C,QACTqL,EAAqBpO,EAAO2H,aAAcvC,EAAuB9kB,EAErE,GACF,CAoBO,SAASguB,IACd,IACEC,GADU5lD,UAAUD,OAAS,QAAsBtB,IAAjBuB,UAAU,GAAmBA,UAAU,GAAK,CAAC,GACtD6lD,WACzBA,OAAkC,IAArBD,GAAsCA,EACrD,OAAO,SAAUnE,GACf,IAAIhF,EAAwBgF,EAAMhF,sBAC9B9kB,EAAU,CACZwf,QAAS,IAEP2O,EAAmB78B,SAASC,cAAc,QAC1C68B,EAAU98B,SAAS+8B,cAAc,QAErC,OADAF,EAAiB59C,KAAO,wBACjB,CACLkyC,OAAQ,eACRyL,WAAYA,EACZ3E,cAAe,WAA0B,EACzC+E,UAAW,WAET/6B,YAAW,WACT,IAAIjpB,EAASw6C,EAAsBx6C,OACnC01B,EAAQuuB,GAAKjkD,EAAOkkD,aAAelkD,EAAOkkD,YAAYzhB,UAAYziC,EAAOkkD,YAAYzhB,UAAUphC,MAAQrB,EAAOmkD,IAC9GX,EAAqBhJ,EAAsB0E,UAAUnC,aAAcvC,EAAuB9kB,GAC1F8kB,EAAsB5T,WAAWliC,SAAQ,SAAUkiC,GACjD,OAAOlR,EAAQwf,QAAQv2C,KAAK,CAC1BioC,YAAY,EACZtpC,KAAMspC,EAAWhhC,SAASuyC,OAC1BiM,SAAUxd,EAAWhhC,SAASg+C,YAElC,IACAC,EAAiBxtC,QAAUhJ,KAAKC,UAAUooB,GAC1CouB,EAAQhW,YAAY+V,EACtB,GAAG,EACL,EACAQ,QAAS,WAAoB,EAC7BC,YAAa,WACXT,EAAiBU,QACnB,EAEJ,CACF,gBCrFA,SAAS,EAAQ5nC,GAAkC,OAAO,EAAU,mBAAqBoJ,QAAU,iBAAmBA,OAAO0vB,SAAW,SAAU94B,GAAO,cAAcA,CAAK,EAAI,SAAUA,GAAO,OAAOA,GAAO,mBAAqBoJ,QAAUpJ,EAAInW,cAAgBuf,QAAUpJ,IAAQoJ,OAAOhpB,UAAY,gBAAkB4f,CAAK,EAAG,EAAQA,EAAM,CAE/U,SAAS6nC,EAAkBloC,EAAQqe,GAAS,IAAK,IAAIh9B,EAAI,EAAGA,EAAIg9B,EAAM78B,OAAQH,IAAK,CAAE,IAAI8mD,EAAa9pB,EAAMh9B,GAAI8mD,EAAW1oC,WAAa0oC,EAAW1oC,aAAc,EAAO0oC,EAAWxoC,cAAe,EAAU,UAAWwoC,IAAYA,EAAWzoC,UAAW,GAAM7Z,OAAOk0C,eAAe/5B,EAAQ,EAAemoC,EAAWjlD,KAAMilD,EAAa,CAAE,CAE5U,SAAS,EAAgB9nC,EAAKnd,EAAK6B,GAA4L,OAAnL7B,EAAM,EAAeA,MAAiBmd,EAAOxa,OAAOk0C,eAAe15B,EAAKnd,EAAK,CAAE6B,MAAOA,EAAO0a,YAAY,EAAME,cAAc,EAAMD,UAAU,IAAkBW,EAAInd,GAAO6B,EAAgBsb,CAAK,CAC3O,SAAS,EAAejgB,GAAO,IAAI8C,EACnC,SAAsB82C,EAAOC,GAAQ,GAAuB,WAAnB,EAAQD,IAAiC,OAAVA,EAAgB,OAAOA,EAAO,IAAIE,EAAOF,EAAMvwB,OAAO0wB,aAAc,QAAaj6C,IAATg6C,EAAoB,CAAE,IAAIhiC,EAAMgiC,EAAKr4C,KAAKm4C,EAAOC,GAAQ,WAAY,GAAqB,WAAjB,EAAQ/hC,GAAmB,OAAOA,EAAK,MAAM,IAAIpX,UAAU,+CAAiD,CAAE,OAAiB,WAATm5C,EAAoBn7B,OAASs7B,QAAQJ,EAAQ,CADnV,CAAa55C,EAAK,UAAW,MAAwB,WAAjB,EAAQ8C,GAAoBA,EAAM4b,OAAO5b,EAAM,CAI5H,IAAIklD,EAAiB,SAAwBC,GACvCA,IAGF59B,OAAOC,SAAS29B,MAAQA,EAE5B,EACIC,EAA8B,WAKhC,SAASA,EAAeriB,GACtB,IAAI6b,EAAQ/hD,KACRwoD,EAActiB,EAAKsiB,YACrBC,EAAkBviB,EAAKwiB,WACvBA,OAAiC,IAApBD,EAA6B,IAAMA,EAChDjK,EAAYtY,EAAKsY,UACjBmK,EAAWziB,EAAKyiB,SAChBC,EAAc1iB,EAAK0iB,YACnB57B,EAAQkZ,EAAKlZ,MACb6T,EAAUqF,EAAKrF,QACfv+B,EAAO4jC,EAAK5jC,MA9BlB,SAAyBiH,EAAUs/C,GAAe,KAAMt/C,aAAoBs/C,GAAgB,MAAM,IAAI9nD,UAAU,oCAAwC,CA+BpJ+nD,CAAgB9oD,KAAMuoD,GACtB,EAAgBvoD,KAAM,SAAU,eAIhC,EAAgBA,KAAM,mBAAe,GAQrC,EAAgBA,KAAM,kBAAc,GAKpC,EAAgBA,KAAM,kBAAc,GAKpC,EAAgBA,KAAM,gBAAY,GAKlC,EAAgBA,KAAM,mBAAe,GACrC,EAAgBA,KAAM,kBAAc,GACpC,EAAgBA,KAAM,mBAAe,GAIrC,EAAgBA,KAAM,cAAc,GAIpC,EAAgBA,KAAM,cAAc,GAOpC,EAAgBA,KAAM,4BAA6B,GACnD,EAAgBA,KAAM,cAAU,GAChC,EAAgBA,KAAM,gBAAY,GAClC,EAAgBA,KAAM,aAAS,GAC/BA,KAAKwoD,YAAcA,EACnBxoD,KAAK+oD,gBAAa5oD,EAClBH,KAAK0oD,WAAaA,EAClB1oD,KAAK4hD,WAAapD,EAClBx+C,KAAK2oD,SAAWA,EAChB3oD,KAAK4oD,YAAcA,EACnB5oD,KAAKgpD,OAASh8B,EACdhtB,KAAKipD,SAAWpoB,EAChB7gC,KAAKkpD,MAAQ5mD,EACbwjD,GAAmB,SAAUrD,GAC3B,IAAI/3B,EAAS+3B,EAAM/3B,OACf49B,EAAQvG,EAAMyG,aAAezG,EAAMyG,YAAYzG,EAAMoH,QACzDd,EAAeC,GACfvG,EAAMqH,0BAA4B1+B,EAAO2+B,QAAQ5nD,MACnD,GACF,CA7FF,IAAsBonD,EAAaS,EAAYC,EAqP7C,OArPoBV,EAkGPN,GAlGoBe,EAkGJ,CAAC,CAC5BnmD,IAAK,OACL6B,MAAO,WACL,OAAOhF,KAAK2oD,SAAS,CACnBa,SAAU,EACVC,SAAUzpD,KAAK4oD,eAEnB,GAKC,CACDzlD,IAAK,QACL6B,MAAO,SAAe0kD,GACpB,IAAInH,EAASviD,KACb8lD,GAAmB,SAAU3C,GAC3B,IAAIz4B,EAASy4B,EAAMz4B,OACfi/B,EAAMpH,EAAO/D,UAAUkL,GACvBpB,EAAQ/F,EAAOiG,aAAejG,EAAOiG,YAAYkB,GACjDnH,EAAOwG,YACTp8B,aAAa41B,EAAOwG,YAEtBxG,EAAOwG,WAAan8B,YAAW,WAC7By7B,EAAeC,GACX/F,EAAOqH,YAAYD,KACjBpH,EAAO2G,MACT3G,EAAO2G,MAAMS,GAEbj/B,EAAO2+B,QAAQQ,UAAUH,EAAYpB,GAAS,GAAIqB,GAEpDpH,EAAO6G,0BAA4B1+B,EAAO2+B,QAAQ5nD,QAEpD8gD,EAAOuH,YAAa,EACpBvH,EAAOwG,gBAAa5oD,CACtB,GAAGoiD,EAAOmG,WACZ,GACF,GAMC,CACDvlD,IAAK,WACL6B,MAAO,SAAkBsiC,GACvB,IAAIqb,EAAS3iD,KACTA,KAAKgpD,QACPhpD,KAAKgpD,QAAO,WACV1hB,EAASqb,EAAOwG,OAClB,IAEFnpD,KAAK+pD,YAAc,WACbpH,EAAOoG,aACTp8B,aAAag2B,EAAOoG,YACpBpG,EAAOoG,gBAAa5oD,GAEtBwiD,EAAOmH,YAAa,EAIpBxiB,EAASqb,EAAOwG,OAClB,EACArD,GAAmB,SAAUzC,GACdA,EAAM34B,OACZuE,iBAAiB,WAAY0zB,EAAOoH,YAC7C,GACF,GASC,CACD5mD,IAAK,YACL6B,MAAO,SAAmB0kD,GAexB,OAdU1pD,KAAK4hD,WAAW,CACxB4H,SAAU,EACVE,WAAYA,EACZD,SAAUzpD,KAAK4oD,eAYnB,GAKC,CACDzlD,IAAK,UACL6B,MAAO,WACL,IAAIy+C,EAASzjD,KACTA,KAAKipD,UACPjpD,KAAKipD,WAEPjpD,KAAKgqD,YAAa,EAClBlE,GAAmB,SAAUtC,GAC3B,IAAI94B,EAAS84B,EAAM94B,OACf+4B,EAAOsG,aACTr/B,EAAOwE,oBAAoB,WAAYu0B,EAAOsG,YAElD,IACI/pD,KAAK+oD,YACPp8B,aAAa3sB,KAAK+oD,YAEpB/oD,KAAKiqD,MAAM,CAAC,EACd,GACC,CACD9mD,IAAK,QACL6B,MAAO,WACLhF,KAAKgqD,YAAa,CACpB,GACC,CACD7mD,IAAK,cACL6B,MAAO,SAAqB2kD,GAC1B,IAAI9F,EAAS7jD,KACb,OAAO8lD,GAAmB,SAAU9B,GAClC,IAAIt5B,EAASs5B,EAAMt5B,OAMfw/B,IAAgCrG,EAAOmG,YAAcnG,EAAOuF,4BAA8B1+B,EAAO2+B,QAAQ5nD,QAC7G,OAGGoiD,EAAOiG,YAERI,GAEAP,IAAQj/B,EAAO++B,SAASU,IAE5B,GACF,MAnP0EhC,EAAkBU,EAAYnoD,UAAW4oD,GAAiBC,GAAapB,EAAkBU,EAAaU,GAAczjD,OAAOk0C,eAAe6O,EAAa,YAAa,CAAElpC,UAAU,IAqPrP4oC,CACT,CAzOkC,GChBlC,SAAS,EAAQjoC,GAAkC,OAAO,EAAU,mBAAqBoJ,QAAU,iBAAmBA,OAAO0vB,SAAW,SAAU94B,GAAO,cAAcA,CAAK,EAAI,SAAUA,GAAO,OAAOA,GAAO,mBAAqBoJ,QAAUpJ,EAAInW,cAAgBuf,QAAUpJ,IAAQoJ,OAAOhpB,UAAY,gBAAkB4f,CAAK,EAAG,EAAQA,EAAM,CAC/U,IAAI87B,EAAY,CAAC,aACjB,SAAS,EAAQh7B,EAAQm4B,GAAkB,IAAIxzC,EAAOD,OAAOC,KAAKqb,GAAS,GAAItb,OAAO0zC,sBAAuB,CAAE,IAAIC,EAAU3zC,OAAO0zC,sBAAsBp4B,GAASm4B,IAAmBE,EAAUA,EAAQrzC,QAAO,SAAUszC,GAAO,OAAO5zC,OAAO6zC,yBAAyBv4B,EAAQs4B,GAAKh6B,UAAY,KAAK3Z,EAAKzD,KAAKL,MAAM8D,EAAM0zC,EAAU,CAAE,OAAO1zC,CAAM,CACpV,SAAS,EAAcka,GAAU,IAAK,IAAI3e,EAAI,EAAGA,EAAII,UAAUD,OAAQH,IAAK,CAAE,IAAIwd,EAAS,MAAQpd,UAAUJ,GAAKI,UAAUJ,GAAK,CAAC,EAAGA,EAAI,EAAI,EAAQwE,OAAOgZ,IAAS,GAAIzW,SAAQ,SAAUlF,GAAO,EAAgB8c,EAAQ9c,EAAK2b,EAAO3b,GAAO,IAAK2C,OAAOg0C,0BAA4Bh0C,OAAOi0C,iBAAiB95B,EAAQna,OAAOg0C,0BAA0Bh7B,IAAW,EAAQhZ,OAAOgZ,IAASzW,SAAQ,SAAUlF,GAAO2C,OAAOk0C,eAAe/5B,EAAQ9c,EAAK2C,OAAO6zC,yBAAyB76B,EAAQ3b,GAAO,GAAI,CAAE,OAAO8c,CAAQ,CACzf,SAAS,EAAgBK,EAAKnd,EAAK6B,GAA4L,OAAnL7B,EAC5C,SAAwB9C,GAAO,IAAI8C,EACnC,SAAsB82C,EAAOC,GAAQ,GAAuB,WAAnB,EAAQD,IAAiC,OAAVA,EAAgB,OAAOA,EAAO,IAAIE,EAAOF,EAAMvwB,OAAO0wB,aAAc,QAAaj6C,IAATg6C,EAAoB,CAAE,IAAIhiC,EAAMgiC,EAAKr4C,KAAKm4C,EAAOC,GAAQ,WAAY,GAAqB,WAAjB,EAAQ/hC,GAAmB,OAAOA,EAAK,MAAM,IAAIpX,UAAU,+CAAiD,CAAE,OAAiB,WAATm5C,EAAoBn7B,OAASs7B,QAAQJ,EAAQ,CADnV,CAAa55C,EAAK,UAAW,MAAwB,WAAjB,EAAQ8C,GAAoBA,EAAM4b,OAAO5b,EAAM,CAD1E,CAAeA,MAAiBmd,EAAOxa,OAAOk0C,eAAe15B,EAAKnd,EAAK,CAAE6B,MAAOA,EAAO0a,YAAY,EAAME,cAAc,EAAMD,UAAU,IAAkBW,EAAInd,GAAO6B,EAAgBsb,CAAK,CAG3O,SAAS+7B,EAAyBv9B,EAAQyB,GAAY,GAAc,MAAVzB,EAAgB,MAAO,CAAC,EAAG,IAAkE3b,EAAK7B,EAAnE2e,EACzF,SAAuCnB,EAAQyB,GAAY,GAAc,MAAVzB,EAAgB,MAAO,CAAC,EAAG,IAA2D3b,EAAK7B,EAA5D2e,EAAS,CAAC,EAAOO,EAAa1a,OAAOC,KAAK+Y,GAAqB,IAAKxd,EAAI,EAAGA,EAAIkf,EAAW/e,OAAQH,IAAO6B,EAAMqd,EAAWlf,GAAQif,EAAS9Z,QAAQtD,IAAQ,IAAa8c,EAAO9c,GAAO2b,EAAO3b,IAAQ,OAAO8c,CAAQ,CADhNq8B,CAA8Bx9B,EAAQyB,GAAuB,GAAIza,OAAO0zC,sBAAuB,CAAE,IAAI+C,EAAmBz2C,OAAO0zC,sBAAsB16B,GAAS,IAAKxd,EAAI,EAAGA,EAAIi7C,EAAiB96C,OAAQH,IAAO6B,EAAMo5C,EAAiBj7C,GAAQif,EAAS9Z,QAAQtD,IAAQ,GAAkB2C,OAAOpF,UAAU87C,qBAAqB16C,KAAKgd,EAAQ3b,KAAgB8c,EAAO9c,GAAO2b,EAAO3b,GAAQ,CAAE,OAAO8c,CAAQ,CAE3e,SAASmqC,EAA8BhM,GACrBA,EAAQ4G,UAExB,OADmB3I,EAAyB+B,EAAShC,EAEvD,CCbA,SAASiO,EAAY/pC,GACnB,OAAOA,IAAQxa,OAAOwa,EACxB,CACO,SAASgqC,EAAQC,EAAOC,GAC7B,GAAID,IAAUC,EACZ,OAAO,EAET,GAAIH,EAAYE,IAAUF,EAAYG,IAA4B,oBAAVD,GAA0C,oBAAXC,EACrF,OAAOD,IAAUC,EAEnB,GAAI1kD,OAAOC,KAAKwkD,GAAO9oD,SAAWqE,OAAOC,KAAKykD,GAAQ/oD,OACpD,OAAO,EAKT,IAAK,IAAIwkD,EAAK,EAAGwE,EAAe3kD,OAAOC,KAAKwkD,GAAQtE,EAAKwE,EAAahpD,OAAQwkD,IAAM,CAClF,IAAI9iD,EAAMsnD,EAAaxE,GACvB,KAAM9iD,KAAOqnD,GACX,OAAO,EAET,IAAKF,EAAQC,EAAMpnD,GAAMqnD,EAAOrnD,IAC9B,OAAO,CAEX,CACA,OAAO,CACT,CC1BA,SAAS,EAAQmd,GAAkC,OAAO,EAAU,mBAAqBoJ,QAAU,iBAAmBA,OAAO0vB,SAAW,SAAU94B,GAAO,cAAcA,CAAK,EAAI,SAAUA,GAAO,OAAOA,GAAO,mBAAqBoJ,QAAUpJ,EAAInW,cAAgBuf,QAAUpJ,IAAQoJ,OAAOhpB,UAAY,gBAAkB4f,CAAK,EAAG,EAAQA,EAAM,CAC/U,SAAS,EAAQc,EAAQm4B,GAAkB,IAAIxzC,EAAOD,OAAOC,KAAKqb,GAAS,GAAItb,OAAO0zC,sBAAuB,CAAE,IAAIC,EAAU3zC,OAAO0zC,sBAAsBp4B,GAASm4B,IAAmBE,EAAUA,EAAQrzC,QAAO,SAAUszC,GAAO,OAAO5zC,OAAO6zC,yBAAyBv4B,EAAQs4B,GAAKh6B,UAAY,KAAK3Z,EAAKzD,KAAKL,MAAM8D,EAAM0zC,EAAU,CAAE,OAAO1zC,CAAM,CACpV,SAAS,EAAcka,GAAU,IAAK,IAAI3e,EAAI,EAAGA,EAAII,UAAUD,OAAQH,IAAK,CAAE,IAAIwd,EAAS,MAAQpd,UAAUJ,GAAKI,UAAUJ,GAAK,CAAC,EAAGA,EAAI,EAAI,EAAQwE,OAAOgZ,IAAS,GAAIzW,SAAQ,SAAUlF,GAAO,EAAgB8c,EAAQ9c,EAAK2b,EAAO3b,GAAO,IAAK2C,OAAOg0C,0BAA4Bh0C,OAAOi0C,iBAAiB95B,EAAQna,OAAOg0C,0BAA0Bh7B,IAAW,EAAQhZ,OAAOgZ,IAASzW,SAAQ,SAAUlF,GAAO2C,OAAOk0C,eAAe/5B,EAAQ9c,EAAK2C,OAAO6zC,yBAAyB76B,EAAQ3b,GAAO,GAAI,CAAE,OAAO8c,CAAQ,CACzf,SAAS,EAAgBK,EAAKnd,EAAK6B,GAA4L,OAAnL7B,EAC5C,SAAwB9C,GAAO,IAAI8C,EACnC,SAAsB82C,EAAOC,GAAQ,GAAuB,WAAnB,EAAQD,IAAiC,OAAVA,EAAgB,OAAOA,EAAO,IAAIE,EAAOF,EAAMvwB,OAAO0wB,aAAc,QAAaj6C,IAATg6C,EAAoB,CAAE,IAAIhiC,EAAMgiC,EAAKr4C,KAAKm4C,EAAOC,GAAQ,WAAY,GAAqB,WAAjB,EAAQ/hC,GAAmB,OAAOA,EAAK,MAAM,IAAIpX,UAAU,+CAAiD,CAAE,OAAiB,WAATm5C,EAAoBn7B,OAASs7B,QAAQJ,EAAQ,CADnV,CAAa55C,EAAK,UAAW,MAAwB,WAAjB,EAAQ8C,GAAoBA,EAAM4b,OAAO5b,EAAM,CAD1E,CAAeA,MAAiBmd,EAAOxa,OAAOk0C,eAAe15B,EAAKnd,EAAK,CAAE6B,MAAOA,EAAO0a,YAAY,EAAME,cAAc,EAAMD,UAAU,IAAkBW,EAAInd,GAAO6B,EAAgBsb,CAAK,CAMpO,IAAIoqC,EAAyB,WAClC,IAAIpsB,EAAQ58B,UAAUD,OAAS,QAAsBtB,IAAjBuB,UAAU,GAAmBA,UAAU,GAAK,CAAC,EAC7EipD,EAAgBrsB,EAAMssB,OACxBA,OAA2B,IAAlBD,EH8OE,WACb,IAAItG,EAAQ3iD,UAAUD,OAAS,QAAsBtB,IAAjBuB,UAAU,GAAmBA,UAAU,GAAK,CAAC,EAC/EmpD,EAAkBxG,EAAM7F,UACxBA,OAAgC,IAApBqM,EAA6B,SAAUC,GACjD,IAAItB,EAAWsB,EAAMtB,SACnBE,EAAaoB,EAAMpB,WACnBD,EAAWqB,EAAMrB,SACfsB,EAAWtB,EAASsB,SACtBC,EAAWvB,EAASuB,SACpBC,EAAiBxB,EAASyB,KAC1BA,OAA0B,IAAnBD,EAA4B,GAAKA,EACxCE,EAAW1B,EAAS0B,SACpBC,EAAO3B,EAAS2B,KACdC,EAAc7B,EAASv4C,UAAUy4C,GACjC4B,EAA0B,KAATJ,EAAc,GAAK,IAAI9lD,OAAO8lD,GAGnD,OAAKG,EAGE,GAAGjmD,OAAO2lD,EAAU,MAAM3lD,OAAO4lD,GAAU5lD,OAAOkmD,GAAgBlmD,OAAO+lD,EAAU,KAAK/lD,OAAOimD,GAAajmD,OAAOgmD,GAFjH,GAAGhmD,OAAO2lD,EAAU,MAAM3lD,OAAO4lD,GAAU5lD,OAAOkmD,GAAgBlmD,OAAO+lD,GAAU/lD,OAAOgmD,EAGrG,EAAIP,EACJU,EAAiBlH,EAAMsE,SACvBA,OAA8B,IAAnB4C,EAA4B,SAAUC,GAC/C,IAAIhC,EAAWgC,EAAMhC,SACnBC,EAAW+B,EAAM/B,SAWnB,OAAOD,EAAS5lC,MAAM6lC,EAASrwC,OAAOpX,MAAM,GAAI,CAC9CkiB,WAAY,IAEhB,EAAIqnC,EACJE,EAAmBpH,EAAMqE,WACzBA,OAAkC,IAArB+C,EAA8B,IAAMA,EACjDjD,EAAcnE,EAAMmE,YACpBkD,EAAoBrH,EAAMuE,YAC1BA,OAAoC,IAAtB8C,EAA+B,WAC3C,OAAO5F,GAAmB,SAAU6F,GAElC,OADaA,EAAOjhC,OACN++B,QAChB,GAAG,CACD96B,SAAU,WACR,MAAM,IAAIhtB,MAAM,2GAClB,GAEJ,EAAI+pD,EACJ1+B,EAAQq3B,EAAMr3B,MACd6T,EAAUwjB,EAAMxjB,QAChBv+B,EAAO+hD,EAAM/hD,KACf,OAAO,IAAIimD,EAAe,CACxB/J,UAAWA,EACXmK,SAAUA,EACVD,WAAYA,EACZF,YAAaA,EACbI,YAAaA,EACb57B,MAAOA,EACP6T,QAASA,EACTv+B,KAAMA,GAEV,CGjTwCspD,GAAkBjB,EACtDkB,EAAsBvtB,EAAMwtB,aAC5BA,OAAuC,IAAxBD,EFKV,CACL/P,OAAQ,aACRiQ,aAAc,SAAsB3N,GAClC,OAAOt4C,OAAOC,KAAKq4C,GAASp4C,QAAO,SAAUkL,EAAO0vC,GAClD,OAAO,EAAc,EAAc,CAAC,EAAG1vC,GAAQ,CAAC,EAAG,EAAgB,CAAC,EAAG0vC,EAASwJ,EAA8BhM,EAAQwC,KACxH,GAAG,CAAC,EACN,EACAoL,aAAc,WACZ,IAAItC,EAAahoD,UAAUD,OAAS,QAAsBtB,IAAjBuB,UAAU,GAAmBA,UAAU,GAAK,CAAC,EACtF,OAAOoE,OAAOC,KAAK2jD,GAAY1jD,QAAO,SAAUkL,EAAO0vC,GACrD,OAAO,EAAc,EAAc,CAAC,EAAG1vC,GAAQ,CAAC,EAAG,EAAgB,CAAC,EAAG0vC,EAASwJ,EAA8BV,EAAW9I,KAC3H,GAAG,CAAC,EACN,GEjBuEiL,EACvEI,EAAoB3tB,EAAMipB,WAC1BA,OAAmC,IAAtB0E,GAAuCA,EACtD,OAAO,SAAU/lB,GACf,IAAIiY,EAAwBjY,EAAKiY,sBAmBjCA,EAAsByD,WAlBtB,SAA2BD,GACzB,IAAImC,EAOoD,IAAxD3F,EAAsB0E,UAAUnC,aAAaj/C,OAAe08C,EAAsBiE,gBAAkBjE,EAAsB0E,UAAU5C,iBAAiB,CAAC,GAClJ7B,EAAUt4C,OAAOC,KAAK47C,GAAW37C,QAAO,SAAU8J,EAAK8wC,GACzD,OAAO,EAAc,EAAc,CAAC,EAAG9wC,GAAM,CAAC,EAAG,EAAgB,CAAC,EAAG8wC,EAASe,EAAUf,IAC1F,GAAGkD,GACCoI,EAAQJ,EAAaC,aAAa3N,GACtC,OAAOwM,EAAOpM,UAAU0N,EAC1B,EAKA,IAAIC,OAAiBhsD,EACjB6/C,EAAiB7B,EAAsBiE,gBAC3C,MAAO,CACLtG,OAAQ,sBAAsB12C,OAAOwlD,EAAO9O,QAAU,cAAe,mBAAmB12C,OAAO0mD,EAAahQ,QAAU,cAAe,MACrIyL,WAAYA,EACZ3E,cAAe,SAAuBH,GACpC,IAAIrE,EAAUqE,EAAMrE,QAChBsL,EAAaoC,EAAaC,aAAa3N,QACpBj+C,IAAnBgsD,GAAiC7B,EAAQ6B,EAAgBzC,KAC3DkB,EAAOX,MAAMP,GACbyC,EAAiBzC,EAErB,EACA/B,UAAW,WACTxJ,EAAsBiE,gBAAkB,EAAc,EAAc,CAAC,EAAGpC,GAAiB8L,EAAaE,aAAapB,EAAOzB,SAC1HyB,EAAOwB,UAAS,SAAUF,GACpB/N,EAAsB0E,UAAUnC,aAAaj/C,OAAS,GACxD08C,EAAsB2E,WAAWgJ,EAAaE,aAAaE,GAE/D,GACF,EACAlE,QAAS,WACP,IAAIqE,EAC+B,QAAlCA,EAAgBzB,EAAO59B,aAAqC,IAAlBq/B,GAAoCA,EAAcvqD,KAAK8oD,EACpG,EACA3C,YAAa,WACX2C,EAAO/pB,SACT,EAEJ,CACF,aCnEWyrB,EAAY,SAAmBC,GACxC,OAAO,WACL,IAAIrmB,EAAOxkC,UAAUD,OAAS,QAAsBtB,IAAjBuB,UAAU,GAAmBA,UAAU,GAAK,CAAC,EAC9E8qD,EAAiBtmB,EAAKsmB,eACtBC,EAAevmB,EAAKumB,aAClBC,EAAaF,EAAiB,IAAIpnD,OAAOonD,GAAkB,GAC3DG,EAAWF,EAAe,KAAKrnD,OAAOqnD,GAAgB,GAC1D,MAAO,GAAGrnD,OARE,MAQgB,KAAKA,OAAOmnD,GAAennD,OAAOsnD,GAAYtnD,OAAOunD,EACnF,CACF,ECVO,SAASC,EAAkBxrC,EAAQhT,GAExC,OADYrM,MAAMoF,QAAQiH,GAAQA,EAAOA,EAAKwC,MAAM,MACvC5K,QAAO,SAAUkwB,EAAS/yB,GACrC,OAAO+yB,GAAWA,EAAQ/yB,EAC5B,GAAGie,EACL,gBCHIyrC,EAAOP,EAAU,aCDd,SAASQ,EAAuBn6C,GACrC,IAAI8nC,EAAkB,KAAgBA,gBACpCC,EAAmB,KAAgBA,iBACrC,OAAO/nC,EAAM3J,KAAI,SAAU6H,GACzB,OAAOA,EAAKk8C,cAAgBtS,EAAkB5pC,EAAK7L,MAAQ01C,EAAmB7pC,EAAK7L,KACrF,IAAG0c,KAAK,GACV,iBCNIsrC,GAAkB,IAAInS,OAAO,OAC1B,SAASoS,GAAyBt6C,EAAOrR,GAC9C,IAAI4rD,EAAQC,EACRj3B,EAAUvjB,EAAMrR,GAChB8rD,GAAiD,QAA3BF,EAASv6C,EAAMrR,EAAI,UAA2B,IAAX4rD,OAAoB,EAASA,EAAOH,iBAAkB,EAC/GM,GAAsD,QAA5BF,EAAUx6C,EAAMrR,EAAI,UAA4B,IAAZ6rD,OAAqB,EAASA,EAAQJ,iBAAkB,EAC1H,OAAKC,GAAgB1pC,MAAK,QAAS4S,EAAQlxB,SAAWqoD,IAA0BD,EAGzEl3B,EAAQ62B,cAFNM,CAGX,CCXA,SAAS,GAAQ/sC,GAAkC,OAAO,GAAU,mBAAqBoJ,QAAU,iBAAmBA,OAAO0vB,SAAW,SAAU94B,GAAO,cAAcA,CAAK,EAAI,SAAUA,GAAO,OAAOA,GAAO,mBAAqBoJ,QAAUpJ,EAAInW,cAAgBuf,QAAUpJ,IAAQoJ,OAAOhpB,UAAY,gBAAkB4f,CAAK,EAAG,GAAQA,EAAM,CAC/U,SAAS,GAAQc,EAAQm4B,GAAkB,IAAIxzC,EAAOD,OAAOC,KAAKqb,GAAS,GAAItb,OAAO0zC,sBAAuB,CAAE,IAAIC,EAAU3zC,OAAO0zC,sBAAsBp4B,GAASm4B,IAAmBE,EAAUA,EAAQrzC,QAAO,SAAUszC,GAAO,OAAO5zC,OAAO6zC,yBAAyBv4B,EAAQs4B,GAAKh6B,UAAY,KAAK3Z,EAAKzD,KAAKL,MAAM8D,EAAM0zC,EAAU,CAAE,OAAO1zC,CAAM,CACpV,SAAS,GAAcka,GAAU,IAAK,IAAI3e,EAAI,EAAGA,EAAII,UAAUD,OAAQH,IAAK,CAAE,IAAIwd,EAAS,MAAQpd,UAAUJ,GAAKI,UAAUJ,GAAK,CAAC,EAAGA,EAAI,EAAI,GAAQwE,OAAOgZ,IAAS,GAAIzW,SAAQ,SAAUlF,GAAO,GAAgB8c,EAAQ9c,EAAK2b,EAAO3b,GAAO,IAAK2C,OAAOg0C,0BAA4Bh0C,OAAOi0C,iBAAiB95B,EAAQna,OAAOg0C,0BAA0Bh7B,IAAW,GAAQhZ,OAAOgZ,IAASzW,SAAQ,SAAUlF,GAAO2C,OAAOk0C,eAAe/5B,EAAQ9c,EAAK2C,OAAO6zC,yBAAyB76B,EAAQ3b,GAAO,GAAI,CAAE,OAAO8c,CAAQ,CACzf,SAAS,GAAgBK,EAAKnd,EAAK6B,GAA4L,OAAnL7B,EAC5C,SAAwB9C,GAAO,IAAI8C,EACnC,SAAsB82C,EAAOC,GAAQ,GAAuB,WAAnB,GAAQD,IAAiC,OAAVA,EAAgB,OAAOA,EAAO,IAAIE,EAAOF,EAAMvwB,OAAO0wB,aAAc,QAAaj6C,IAATg6C,EAAoB,CAAE,IAAIhiC,EAAMgiC,EAAKr4C,KAAKm4C,EAAOC,GAAQ,WAAY,GAAqB,WAAjB,GAAQ/hC,GAAmB,OAAOA,EAAK,MAAM,IAAIpX,UAAU,+CAAiD,CAAE,OAAiB,WAATm5C,EAAoBn7B,OAASs7B,QAAQJ,EAAQ,CADnV,CAAa55C,EAAK,UAAW,MAAwB,WAAjB,GAAQ8C,GAAoBA,EAAM4b,OAAO5b,EAAM,CAD1E,CAAeA,MAAiBmd,EAAOxa,OAAOk0C,eAAe15B,EAAKnd,EAAK,CAAE6B,MAAOA,EAAO0a,YAAY,EAAME,cAAc,EAAMD,UAAU,IAAkBW,EAAInd,GAAO6B,EAAgBsb,CAAK,CAIpO,SAASgtC,GAAwB36C,GACtC,OAAKA,EAAMiP,MAAK,SAAU/Q,GACxB,OAAOA,EAAKk8C,aACd,IAOOp6C,EAAM3J,KAAI,SAAU6H,EAAMvP,GAC/B,OAAO,GAAc,GAAc,CAAC,EAAGuP,GAAO,CAAC,EAAG,CAChDk8C,eAAgBE,GAAyBt6C,EAAOrR,IAEpD,IAVSqR,EAAM3J,KAAI,SAAU6H,GACzB,OAAO,GAAc,GAAc,CAAC,EAAGA,GAAO,CAAC,EAAG,CAChDk8C,eAAe,GAEnB,GAOJ,CCrBO,SAASQ,GAAoBC,GAElC,IAAI9S,EAAmB,KAAgBA,iBACrCD,EAAkB,KAAgBA,gBAChCgT,EAAgBD,EAAiB58C,MAAM6pC,GACvCiT,EAAaD,EAAc3mB,QAC3BmC,EAAYykB,EAAkB,CAAC,CACjC1oD,MAAO0oD,EACPX,eAAe,IAFY,GAiB7B,OAbAU,EAAcplD,SAAQ,SAAUuI,GAC9B,IAAI+8C,EAAiB/8C,EAAMA,MAAM8pC,GACjCzR,EAAS3mC,KAAK,CACZ0C,MAAO2oD,EAAe,GACtBZ,eAAe,IAES,KAAtBY,EAAe,IACjB1kB,EAAS3mC,KAAK,CACZ0C,MAAO2oD,EAAe,GACtBZ,eAAe,GAGrB,IACO9jB,CACT,CCvBA,IAAI,GAAOqjB,EAAU,oBCArB,IAAI,GAAOA,EAAU,WCArB,IAAI,GAAOA,EAAU,kCCFrB,SAAS,GAAQhsC,GAAkC,OAAO,GAAU,mBAAqBoJ,QAAU,iBAAmBA,OAAO0vB,SAAW,SAAU94B,GAAO,cAAcA,CAAK,EAAI,SAAUA,GAAO,OAAOA,GAAO,mBAAqBoJ,QAAUpJ,EAAInW,cAAgBuf,QAAUpJ,IAAQoJ,OAAOhpB,UAAY,gBAAkB4f,CAAK,EAAG,GAAQA,EAAM,CAuChU,SAAS,GAAS6wB,EAAQ9X,GAEvC,OApBK,SAA6B6M,GAClC,IAKI0nB,EALAzc,EAASjL,EAAKiL,OAChB9X,EAAU6M,EAAK7M,QACjB,GAAyB,WAArB,GAAQA,GACV,MAAM,IAAI13B,MAAM,4DAGlB,IACEisD,GAAoB,QAAiBv0B,EACvC,CAAE,MAAO73B,GACP,MAAM,IAAIG,MAAM,+CAClB,CACA,MAAO,yBAA0ByD,OAAO+rC,EAAQ,6BAA+B/rC,OAAOwoD,EAAmB,IAC3G,CAOSC,CAAoB,CACzB1c,OAAQA,EACR9X,QAASA,GAEb,CC7CA,SAAS,GAAQ/Y,GAAkC,OAAO,GAAU,mBAAqBoJ,QAAU,iBAAmBA,OAAO0vB,SAAW,SAAU94B,GAAO,cAAcA,CAAK,EAAI,SAAUA,GAAO,OAAOA,GAAO,mBAAqBoJ,QAAUpJ,EAAInW,cAAgBuf,QAAUpJ,IAAQoJ,OAAOhpB,UAAY,gBAAkB4f,CAAK,EAAG,GAAQA,EAAM,CAC/U,SAAS,GAAQc,EAAQm4B,GAAkB,IAAIxzC,EAAOD,OAAOC,KAAKqb,GAAS,GAAItb,OAAO0zC,sBAAuB,CAAE,IAAIC,EAAU3zC,OAAO0zC,sBAAsBp4B,GAASm4B,IAAmBE,EAAUA,EAAQrzC,QAAO,SAAUszC,GAAO,OAAO5zC,OAAO6zC,yBAAyBv4B,EAAQs4B,GAAKh6B,UAAY,KAAK3Z,EAAKzD,KAAKL,MAAM8D,EAAM0zC,EAAU,CAAE,OAAO1zC,CAAM,CACpV,SAAS,GAAcka,GAAU,IAAK,IAAI3e,EAAI,EAAGA,EAAII,UAAUD,OAAQH,IAAK,CAAE,IAAIwd,EAAS,MAAQpd,UAAUJ,GAAKI,UAAUJ,GAAK,CAAC,EAAGA,EAAI,EAAI,GAAQwE,OAAOgZ,IAAS,GAAIzW,SAAQ,SAAUlF,GAAO,GAAgB8c,EAAQ9c,EAAK2b,EAAO3b,GAAO,IAAK2C,OAAOg0C,0BAA4Bh0C,OAAOi0C,iBAAiB95B,EAAQna,OAAOg0C,0BAA0Bh7B,IAAW,GAAQhZ,OAAOgZ,IAASzW,SAAQ,SAAUlF,GAAO2C,OAAOk0C,eAAe/5B,EAAQ9c,EAAK2C,OAAO6zC,yBAAyB76B,EAAQ3b,GAAO,GAAI,CAAE,OAAO8c,CAAQ,CACzf,SAAS,GAAgBK,EAAKnd,EAAK6B,GAA4L,OAAnL7B,EAC5C,SAAwB9C,GAAO,IAAI8C,EACnC,SAAsB82C,EAAOC,GAAQ,GAAuB,WAAnB,GAAQD,IAAiC,OAAVA,EAAgB,OAAOA,EAAO,IAAIE,EAAOF,EAAMvwB,OAAO0wB,aAAc,QAAaj6C,IAATg6C,EAAoB,CAAE,IAAIhiC,EAAMgiC,EAAKr4C,KAAKm4C,EAAOC,GAAQ,WAAY,GAAqB,WAAjB,GAAQ/hC,GAAmB,OAAOA,EAAK,MAAM,IAAIpX,UAAU,+CAAiD,CAAE,OAAiB,WAATm5C,EAAoBn7B,OAASs7B,QAAQJ,EAAQ,CADnV,CAAa55C,EAAK,UAAW,MAAwB,WAAjB,GAAQ8C,GAAoBA,EAAM4b,OAAO5b,EAAM,CAD1E,CAAeA,MAAiBmd,EAAOxa,OAAOk0C,eAAe15B,EAAKnd,EAAK,CAAE6B,MAAOA,EAAO0a,YAAY,EAAME,cAAc,EAAMD,UAAU,IAAkBW,EAAInd,GAAO6B,EAAgBsb,CAAK,CAK5N,SAASwtC,GAAa5nB,GACnC,IAAI6nB,EAAe7nB,EAAK6nB,aACxB,MAAO,CACLC,aAAc,SAAsBhpD,EAAOi9C,GACzC,OCZC,SAAsBj9C,EAAO+oD,GAClC,OAAO/oD,EAAMipD,eAAeF,EAC9B,CDUa,CAAc1T,OAAO4H,EAAOj9C,IAAS+oD,EAC9C,EACAG,UAAW,SAAmBn6C,EAASkuC,GACrC,IAEE,OAAOA,ETVA,SAAmB/b,GAChC,IAAInhC,EAAYmhC,EAAKnhC,UACnBopD,EAAwBjoB,EAAKkoB,mBAC7BA,OAA+C,IAA1BD,EAAmC,OAASA,EACjEjT,EAAMhV,EAAKgV,IACXmT,EAAkBnoB,EAAKooB,WACvBA,OAAiC,IAApBD,EAA6B,CAAC,EAAIA,EAO/CE,GAL6B3B,EAAkB1R,EAAIE,iBAAkBr2C,IAI/B,CAAC,GACnBC,MACpBwpD,OAAiC,IAAhBD,EAAyB,GAAKA,EAG7CE,EAAY5B,EAAK,CACnBL,eAAgB,iBACZ8B,EAAWI,YAAc,IAAItpD,OAAOkpD,EAAWI,aAAe,IACpE,OAAOF,EAAex4C,QAAQ,IAAI6kC,OAAO,KAAgBJ,gBAAiB,KAAM,IAAIr1C,OAAOgpD,EAAoB,YAAahpD,OAAOqpD,EAAW,OAAQz4C,QAAQ,IAAI6kC,OAAO,KAAgBH,iBAAkB,KAAM,KAAKt1C,OAAOgpD,EAAoB,KACnP,CSXsB,CAAW,GAAc,GAAc,CAAC,EAD/Bp9C,KAAK4S,MAAM7P,IAC0C,CAAC,EAAG,CAC9EmnC,IAAKl7C,QAET,CAAE,MAAOwB,GACP,MAAM,IAAIG,MAAM,qHAClB,CACF,EACAgtD,iBAAkB,SAA0B56C,EAASkuC,GACnD,IAEE,OAAOA,EJpBA,SAA0B/b,GACvC,IAAInhC,EAAYmhC,EAAKnhC,UACnBopD,EAAwBjoB,EAAKkoB,mBAC7BA,OAA+C,IAA1BD,EAAmC,OAASA,EACjEjT,EAAMhV,EAAKgV,IACXmT,EAAkBnoB,EAAKooB,WACvBA,OAAiC,IAApBD,EAA6B,CAAC,EAAIA,EAO/CE,GAL6B3B,EAAkB1R,EAAIE,iBAAkBr2C,IAI/B,CAAC,GACnBC,MACpBwpD,OAAiC,IAAhBD,EAAyB,GAAKA,EAG7CE,EAAY,GAAK,CACnBjC,eAAgB,iBACZ8B,EAAWI,YAAc,IAAItpD,OAAOkpD,EAAWI,aAAe,IAEpE,OAD8B5B,EAAuBQ,GAAwBC,GAAoBiB,KAClEx4C,QAAQ,IAAI6kC,OAAO,KAAgBJ,gBAAiB,KAAM,IAAIr1C,OAAOgpD,EAAoB,YAAahpD,OAAOqpD,EAAW,OAAQz4C,QAAQ,IAAI6kC,OAAO,KAAgBH,iBAAkB,KAAM,KAAKt1C,OAAOgpD,EAAoB,KAC5P,CIFsB,CAAkB,GAAc,GAAc,CAAC,EAD/Bp9C,KAAK4S,MAAM7P,IACiD,CAAC,EAAG,CAC5FmnC,IAAKl7C,QAET,CAAE,MAAOwB,GACP,MAAM,IAAIG,MAAM,gIAClB,CACF,EACAitD,QAAS,SAAiB76C,EAASkuC,GACjC,IAEE,OAAOA,EH9BA,SAAiB/b,GAC9B,IAAInhC,EAAYmhC,EAAKnhC,UACnBopD,EAAwBjoB,EAAKkoB,mBAC7BA,OAA+C,IAA1BD,EAAmC,OAASA,EACjEjT,EAAMhV,EAAKgV,IACXmT,EAAkBnoB,EAAKooB,WACvBA,OAAiC,IAApBD,EAA6B,CAAC,EAAIA,EAO/CE,GAL2B3B,EAAkB1R,EAAIG,eAAgBt2C,IAI7B,CAAC,GACjBC,MACpBwpD,OAAiC,IAAhBD,EAAyB,GAAKA,EAG7CE,EAAY,GAAK,CACnBjC,eAAgB,iBACZ8B,EAAWI,YAAc,IAAItpD,OAAOkpD,EAAWI,aAAe,IACpE,OAAOF,EAAex4C,QAAQ,IAAI6kC,OAAO,KAAgBJ,gBAAiB,KAAM,IAAIr1C,OAAOgpD,EAAoB,YAAahpD,OAAOqpD,EAAW,OAAQz4C,QAAQ,IAAI6kC,OAAO,KAAgBH,iBAAkB,KAAM,KAAKt1C,OAAOgpD,EAAoB,KACnP,CGSsB,CAAS,GAAc,GAAc,CAAC,EAD/Bp9C,KAAK4S,MAAM7P,IACwC,CAAC,EAAG,CAC1EmnC,IAAKl7C,QAET,CAAE,MAAOwB,GACP,MAAM,IAAIG,MAAM,mHAClB,CACF,EACAktD,eAAgB,SAAwB96C,EAASkuC,GAC/C,IAEE,OAAOA,EFxCA,SAAwB/b,GACrC,IAAInhC,EAAYmhC,EAAKnhC,UACnBopD,EAAwBjoB,EAAKkoB,mBAC7BA,OAA+C,IAA1BD,EAAmC,OAASA,EACjEjT,EAAMhV,EAAKgV,IACXmT,EAAkBnoB,EAAKooB,WACvBA,OAAiC,IAApBD,EAA6B,CAAC,EAAIA,EAO/CE,GAL2B3B,EAAkB1R,EAAIG,eAAgBt2C,IAI7B,CAAC,GACjBC,MACpBwpD,OAAiC,IAAhBD,EAAyB,GAAKA,EAG7CE,EAAY,GAAK,CACnBjC,eAAgB,iBACZ8B,EAAWI,YAAc,IAAItpD,OAAOkpD,EAAWI,aAAe,IAEpE,OAD8B5B,EAAuBQ,GAAwBC,GAAoBiB,KAClEx4C,QAAQ,IAAI6kC,OAAO,KAAgBJ,gBAAiB,KAAM,IAAIr1C,OAAOgpD,EAAoB,YAAahpD,OAAOqpD,EAAW,OAAQz4C,QAAQ,IAAI6kC,OAAO,KAAgBH,iBAAkB,KAAM,KAAKt1C,OAAOgpD,EAAoB,KAC5P,CEkBsB,CAAgB,GAAc,GAAc,CAAC,EAD/Bp9C,KAAK4S,MAAM7P,IAC+C,CAAC,EAAG,CACxFmnC,IAAKl7C,QAET,CAAE,MAAOwB,GACP,MAAM,IAAIG,MAAM,8HAClB,CACF,EACAmtD,SAAU,SAAkB/6C,EAASkuC,GACnC,IACE,IAAI8M,EAAc/9C,KAAK4S,MAAM7P,GAC3Bo9B,EAAS4d,EAAY5d,OACrB9X,EAAU01B,EAAY11B,QACxB,OAAO4oB,EAAO,GAAU9Q,EAAQ,GAAc,CAC5C6d,UAAW,CAAChvD,KAAKivD,WAChB51B,IACL,CAAE,MAAO73B,GACP,MAAM,IAAIG,MAAM,2IAClB,CACF,EAEJ,iBEnEIutD,GAAgB50C,QAAQC,UACrB,SAAS40C,GAAM7nB,GACpB,IAAI8nB,EAAW,KACXC,GAAY,EACZprD,EAAK,WACP,IAAK,IAAIsjC,EAAO7lC,UAAUD,OAAQJ,EAAO,IAAIU,MAAMwlC,GAAOC,EAAO,EAAGA,EAAOD,EAAMC,IAC/EnmC,EAAKmmC,GAAQ9lC,UAAU8lC,GAER,OAAb4nB,IAGJA,EAAWF,GAAcn1C,MAAK,WAC5Bq1C,EAAW,KACPC,EACFA,GAAY,EAGd/nB,EAASrlC,WAAM,EAAQZ,EACzB,IACF,EAaA,OAZA4C,EAAGqrD,KAAO,WACR,GAAiB,OAAbF,EACF,MAAM,IAAIztD,MAAM,kEAElB,OAAOytD,CACT,EACAnrD,EAAGsrD,OAAS,WACO,OAAbH,IAGJC,GAAY,EACd,EACOprD,CACT,iBC/BO,SAASurD,GAAoBC,EAAcC,GAChD,IAAItL,EAAmBqL,EAAaC,EAAY7O,eAAiB,CAAC,EAOlE6O,EAAYrR,YAAY1hC,SAAS+yC,EAAYpP,0BAA0BoP,EAAYrR,YAAYntC,MAAO,CACpGktC,QAASgG,KAEXsL,EAAYhP,aAAat6C,OAAOy1C,GAAA,GAAexzC,SAAQ,SAAU0wC,GAC/D,OAAOyW,GAAoBC,EAAc1W,EAC3C,GACF,CChBA,SAAS,GAAQz4B,GAAkC,OAAO,GAAU,mBAAqBoJ,QAAU,iBAAmBA,OAAO0vB,SAAW,SAAU94B,GAAO,cAAcA,CAAK,EAAI,SAAUA,GAAO,OAAOA,GAAO,mBAAqBoJ,QAAUpJ,EAAInW,cAAgBuf,QAAUpJ,IAAQoJ,OAAOhpB,UAAY,gBAAkB4f,CAAK,EAAG,GAAQA,EAAM,CAC/U,SAAS,GAAQc,EAAQm4B,GAAkB,IAAIxzC,EAAOD,OAAOC,KAAKqb,GAAS,GAAItb,OAAO0zC,sBAAuB,CAAE,IAAIC,EAAU3zC,OAAO0zC,sBAAsBp4B,GAASm4B,IAAmBE,EAAUA,EAAQrzC,QAAO,SAAUszC,GAAO,OAAO5zC,OAAO6zC,yBAAyBv4B,EAAQs4B,GAAKh6B,UAAY,KAAK3Z,EAAKzD,KAAKL,MAAM8D,EAAM0zC,EAAU,CAAE,OAAO1zC,CAAM,CAGpV,SAAS,GAAkBka,EAAQqe,GAAS,IAAK,IAAIh9B,EAAI,EAAGA,EAAIg9B,EAAM78B,OAAQH,IAAK,CAAE,IAAI8mD,EAAa9pB,EAAMh9B,GAAI8mD,EAAW1oC,WAAa0oC,EAAW1oC,aAAc,EAAO0oC,EAAWxoC,cAAe,EAAU,UAAWwoC,IAAYA,EAAWzoC,UAAW,GAAM7Z,OAAOk0C,eAAe/5B,EAAQ,GAAemoC,EAAWjlD,KAAMilD,EAAa,CAAE,CAG5U,SAASuH,GAAgB7mC,EAAGuB,GAA6I,OAAxIslC,GAAkB7pD,OAAO8pD,eAAiB9pD,OAAO8pD,eAAe9xC,OAAS,SAAyBgL,EAAGuB,GAAsB,OAAjBvB,EAAE+mC,UAAYxlC,EAAUvB,CAAG,EAAU6mC,GAAgB7mC,EAAGuB,EAAI,CACvM,SAASylC,GAAaC,GAAW,IAAIC,EAGrC,WAAuC,GAAuB,qBAAZC,UAA4BA,QAAQC,UAAW,OAAO,EAAO,GAAID,QAAQC,UAAUC,KAAM,OAAO,EAAO,GAAqB,oBAAVC,MAAsB,OAAO,EAAM,IAAsF,OAAhF7pD,QAAQ7F,UAAU2vD,QAAQvuD,KAAKmuD,QAAQC,UAAU3pD,QAAS,IAAI,WAAa,MAAY,CAAM,CAAE,MAAO2T,GAAK,OAAO,CAAO,CAAE,CAHvQo2C,GAA6B,OAAO,WAAkC,IAAsCl8C,EAAlCm8C,EAAQC,GAAgBT,GAAkB,GAAIC,EAA2B,CAAE,IAAIS,EAAYD,GAAgBxwD,MAAMmK,YAAaiK,EAAS67C,QAAQC,UAAUK,EAAO7uD,UAAW+uD,EAAY,MAASr8C,EAASm8C,EAAMtuD,MAAMjC,KAAM0B,WAAc,OACpX,SAAoC0G,EAAMtG,GAAQ,GAAIA,IAA2B,WAAlB,GAAQA,IAAsC,oBAATA,GAAwB,OAAOA,EAAa,QAAa,IAATA,EAAmB,MAAM,IAAIf,UAAU,4DAA+D,OAAO2vD,GAAuBtoD,EAAO,CAD4FuoD,CAA2B3wD,KAAMoU,EAAS,CAAG,CAExa,SAASs8C,GAAuBtoD,GAAQ,QAAa,IAATA,EAAmB,MAAM,IAAIwoD,eAAe,6DAAgE,OAAOxoD,CAAM,CAErK,SAASooD,GAAgB1nC,GAA+J,OAA1J0nC,GAAkB1qD,OAAO8pD,eAAiB9pD,OAAOo2C,eAAep+B,OAAS,SAAyBgL,GAAK,OAAOA,EAAE+mC,WAAa/pD,OAAOo2C,eAAepzB,EAAI,EAAU0nC,GAAgB1nC,EAAI,CACnN,SAAS,GAAgBxI,EAAKnd,EAAK6B,GAA4L,OAAnL7B,EAAM,GAAeA,MAAiBmd,EAAOxa,OAAOk0C,eAAe15B,EAAKnd,EAAK,CAAE6B,MAAOA,EAAO0a,YAAY,EAAME,cAAc,EAAMD,UAAU,IAAkBW,EAAInd,GAAO6B,EAAgBsb,CAAK,CAC3O,SAAS,GAAejgB,GAAO,IAAI8C,EACnC,SAAsB82C,EAAOC,GAAQ,GAAuB,WAAnB,GAAQD,IAAiC,OAAVA,EAAgB,OAAOA,EAAO,IAAIE,EAAOF,EAAMvwB,OAAO0wB,aAAc,QAAaj6C,IAATg6C,EAAoB,CAAE,IAAIhiC,EAAMgiC,EAAKr4C,KAAKm4C,EAAOC,GAAQ,WAAY,GAAqB,WAAjB,GAAQ/hC,GAAmB,OAAOA,EAAK,MAAM,IAAIpX,UAAU,+CAAiD,CAAE,OAAiB,WAATm5C,EAAoBn7B,OAASs7B,QAAQJ,EAAQ,CADnV,CAAa55C,EAAK,UAAW,MAAwB,WAAjB,GAAQ8C,GAAoBA,EAAM4b,OAAO5b,EAAM,CAW5H,IAAIw8C,IAAY,QAAoC,CAClD/1C,KAAM,kBAER,SAASinD,KACP,MAAO,GACT,CAaA,IAAIC,GAA6B,SAAUC,IArC3C,SAAmBC,EAAUC,GAAc,GAA0B,oBAAfA,GAA4C,OAAfA,EAAuB,MAAM,IAAIlwD,UAAU,sDAAyDiwD,EAAStwD,UAAYoF,OAAO2Z,OAAOwxC,GAAcA,EAAWvwD,UAAW,CAAEyJ,YAAa,CAAEnF,MAAOgsD,EAAUrxC,UAAU,EAAMC,cAAc,KAAW9Z,OAAOk0C,eAAegX,EAAU,YAAa,CAAErxC,UAAU,IAAcsxC,GAAYtB,GAAgBqB,EAAUC,EAAa,CAsCjcC,CAAUJ,EAAeC,GACzB,IAxCoBlI,EAAaS,EAAYC,EAwCzC4H,EAASrB,GAAagB,GAC1B,SAASA,EAAc/8C,GACrB,IAAIguC,GA5CR,SAAyBx4C,EAAUs/C,GAAe,KAAMt/C,aAAoBs/C,GAAgB,MAAM,IAAI9nD,UAAU,oCAAwC,CA6CpJ,CAAgBf,KAAM8wD,GAItB,GAAgBJ,GAHhB3O,EAAQoP,EAAOrvD,KAAK9B,OAG2B,cAAU,GACzD,GAAgB0wD,GAAuB3O,GAAQ,iBAAa,GAC5D,GAAgB2O,GAAuB3O,GAAQ,sBAAkB,GACjE,GAAgB2O,GAAuB3O,GAAQ,gBAAiB,MAChE,GAAgB2O,GAAuB3O,GAAQ,cAAU,GACzD,GAAgB2O,GAAuB3O,GAAQ,kBAAc,GAC7D,GAAgB2O,GAAuB3O,GAAQ,iBAAa,GAC5D,GAAgB2O,GAAuB3O,GAAQ,eAAW,GAC1D,GAAgB2O,GAAuB3O,GAAQ,uBAAmB,GAClE,GAAgB2O,GAAuB3O,GAAQ,cAAe,CAAC,GAC/D,GAAgB2O,GAAuB3O,GAAQ,2BAAuB,GACtE,GAAgB2O,GAAuB3O,GAAQ,2BAAuB,GACtE,GAAgB2O,GAAuB3O,GAAQ,uBAAmB,GAClE,GAAgB2O,GAAuB3O,GAAQ,uBAAmB,GAClE,GAAgB2O,GAAuB3O,GAAQ,kBAAc,GAC7D,GAAgB2O,GAAuB3O,GAAQ,uBAAmB,GAClE,GAAgB2O,GAAuB3O,GAAQ,yBAAqB,GACpE,GAAgB2O,GAAuB3O,GAAQ,aAAc,IAC7D,GAAgB2O,GAAuB3O,GAAQ,2BAAuB,GAItE,GAAgB2O,GAAuB3O,GAAQ,SAAU,QAKzD,GAAgB2O,GAAuB3O,GAAQ,aAAS5hD,GACxD,GAAgBuwD,GAAuB3O,GAAQ,iBAAkBoN,IAAM,WACjEpN,EAAMiG,SACRjG,EAAM/9C,WAAWoV,QAErB,KACA,GAAgBs3C,GAAuB3O,GAAQ,iBAAkBoN,IAAM,WACrE,IAAIiC,EACAC,IAAoB3vD,UAAUD,OAAS,QAAsBtB,IAAjBuB,UAAU,KAAmBA,UAAU,GACvC,QAAzC0vD,EAAmBrP,EAAM/9C,kBAA6C,IAArBotD,GAA+BA,EAAiBxyC,uBACtG+N,aAAao1B,EAAMuP,qBACnBvP,EAAMuP,oBAAsB,KACxBD,IACFtP,EAAMnD,OAAS,OACfmD,EAAMvgD,WAAQrB,IAGlB4hD,EAAMc,UAAUZ,OAAO,CACrB9D,sBAAuBuS,GAAuB3O,KAEhDA,EAAM/gD,KAAK,SACb,KACA,GAAgB0vD,GAAuB3O,GAAQ,wBAAyBoN,IAAM,WAC5E,IAAIoC,EAAcxP,EAAMc,UAAU5C,iBAAiB,CAAC,GACpD8B,EAAMxX,WAAWliC,SAAQ,SAAU69B,GAClBA,EAAK38B,SACXq5C,cAAc,CACrBxE,QAASmT,GAEb,GACF,KACAxP,EAAMnhD,gBAAgB,KACtB,IAAI4wD,EAAqBz9C,EAAQwH,UAC/BA,OAAmC,IAAvBi2C,EAAgC,GAAKA,EACjDzD,EAAeh6C,EAAQg6C,aACvB0D,EAAwB19C,EAAQisC,eAChCA,OAA2C,IAA1ByR,EAAmC,CAAC,EAAIA,EACzDC,EAAmB39C,EAAQ49C,QAC3BA,OAA+B,IAArBD,EAA8B,KAAOA,EAC/CE,EAAoB79C,EAAQ+6C,SAC5BA,OAAiC,IAAtB8C,GAAuCA,EAClDC,EAAiB99C,EAAQ89C,eACzBC,EAAwB/9C,EAAQg+C,mBAChCA,OAA+C,IAA1BD,EAAmC,IAAMA,EAC9DE,EAAwBj+C,EAAQk+C,aAChCA,OAAyC,IAA1BD,EAAmC,KAAOA,EACzDE,EAAwBn+C,EAAQo+C,eAChCA,OAA2C,IAA1BD,EAAmC,KAAOA,EAC3DE,EAAwBr+C,EAAQ6uC,cAChCA,OAA0C,IAA1BwP,EAAmC,KAAOA,EAC5D,GAAqB,OAAjBH,EACF,MAAM,IAAItwD,MAAMg+C,GAAU,2CAE5B,GAAmC,oBAAxBsS,EAAa74C,OACtB,MAAM,IAAIzX,MAAM,sLAMlB,GAJ4C,oBAAjCswD,EAAav5C,iBACtBu5C,EAAav5C,gBAAgB,qBAAqBtT,OCxIxD,SDwIwE,MAGhE+sD,GAA4C,oBAAnBA,EAC3B,MAAM,IAAIxwD,MAAMg+C,GAAU,sDA+B5B,GA1BAoC,EAAMp+C,OAASsuD,EACflQ,EAAMoQ,eAAiBA,EACvBpQ,EAAMxmC,UAAYA,EAClBwmC,EAAMtkC,OAAS,KACfskC,EAAM/9C,WAAa,KACnB+9C,EAAMc,WAAY,EAAAj/C,EAAA,GAAM,CACtB2X,UAAWA,IAEbwmC,EAAMa,cAAgBA,EACtBb,EAAMiG,SAAU,EAChBjG,EAAMxD,gBAAkB,CACtB8T,QAAS,GAAc,CACrBtE,aAAcA,IAEhBuE,eAAgB,CAAC,GAEnBvQ,EAAMwQ,oBAAsBR,EAC5BhQ,EAAMuP,oBAAsB,KAC5BvP,EAAMH,WAAaiP,GACnB9O,EAAMK,gBAAkBpC,EACxB+B,EAAMmB,gBAAkB,KACpB2O,IAEF9P,EAAMyQ,gBAAkBX,GAE1B9P,EAAM0Q,oBAAsBxU,EAAA,EACxB0T,EAAS,CACX,IAAIe,EAAmC,mBAAZf,EAAwB,CAAC,EAAIA,EACxDe,EAAcnL,YAAa,EAC3BxF,EAAM4Q,IAAIjI,EAAuBgI,GACnC,CAIA,GAAI5D,EAAU,CACZ,IAAI8D,EAAsC,mBAAb9D,EAAyB,CAAC,EAAIA,EAC3D8D,EAAgBrL,YAAa,EAC7BxF,EAAM4Q,IrBlKL,WACL,IAAIr0B,EAAQ58B,UAAUD,OAAS,QAAsBtB,IAAjBuB,UAAU,GAAmBA,UAAU,GAAK,CAAC,EAC7EmxD,EAAkBv0B,EAAM6zB,eAC1BW,EAAqBx0B,EAAMw0B,mBAC3BC,EAAUz0B,EAAMy0B,QAChB9G,EAAoB3tB,EAAMipB,WAC1BA,OAAmC,IAAtB0E,GAAuCA,EAClD+G,EAA0BH,EACzBA,GAAuC,OAApBA,GACtB/M,GAAmB,SAAU5f,GAC3B,IAAIxb,EAASwb,EAAKxb,OACduoC,EAAUvoC,EAAOwoC,wBAA0B,KACxB,kBAAZD,IACTD,EAA0BtoC,EAAOuoC,IAE9BD,IACHtoC,EAAOwoC,uBAAyBD,EAC3BvoC,EAAOuoC,KACVvoC,EAAOuoC,GAAW,WACXvoC,EAAOuoC,GAASpqC,QACnB6B,EAAOuoC,GAASpqC,MAAQ,IAE1B,IAAK,IAAI0e,EAAO7lC,UAAUD,OAAQJ,EAAO,IAAIU,MAAMwlC,GAAOC,EAAO,EAAGA,EAAOD,EAAMC,IAC/EnmC,EAAKmmC,GAAQ9lC,UAAU8lC,GAEzB9c,EAAOuoC,GAASpqC,MAAMvmB,KAAKjB,EAC7B,EACAqpB,EAAOuoC,GAASnvD,QAAU+iD,EAC1Bn8B,EAAOuoC,GAASE,iBAAkB,GAEpCH,EAA0BtoC,EAAOuoC,GAErC,IAGF,IAAId,EAAiBa,GAA2B/U,EAAA,EAChD,OAAO,SAAUwE,GACf,IAAItE,EAAwBsE,EAAMtE,sBAG9BiV,EAA8BjV,EAAsB5T,WAAWnkC,QAAO,SAAUhE,GAClF,MAA6B,iBAAtBA,EAAEmH,SAASuyC,QAA6B15C,EAAEmH,SAASg+C,UAC5D,IAAGv+C,KAAI,SAAU5G,GACf,OAAOA,EAAEixD,OACX,IACAlV,EAAsBmV,MAAMrxD,MAAMk8C,EAAuBgB,EAAmBiU,IAC5E,IA8CIG,EACA91C,EA9CF+1C,EAAsBzN,EuBlErB,SAA2BkM,GAChC,GAAIA,EAAapK,YAAa,CAE5B,IAAI4L,EAAwBxB,EAAapK,YACvC6L,EAAUD,EAAsBC,QAChCC,EAAkBF,EAAsBE,gBACtCC,EAAS,2BACTC,EAAU,oBAGd,MAAO,CAFKH,EAAQE,IAAWD,EAAgBC,GAClCF,EAAQG,IAAYF,EAAgBE,GAEnD,CAEE,MAAO,CAAC5B,EAAa6B,cAAe7B,EAAa8B,OAErD,CvBkD6BC,CAAkB7V,EAAsBx6C,QACN,GACzDswD,EAAQT,EAAoB,GAC5BO,EAASP,EAAoB,GAI3BU,OAAkB/zD,EAClBg0D,OAAsBh0D,EAC1B,GAAI4B,MAAMoF,QAAQgrD,EAAetpC,OAAQ,CAWvC,IAAIs6B,EwBhFH,SAAciR,EAAOv+C,GAE1B,IADA,IAAI7Q,EACK1D,EAAI,EAAGA,EAAI8yD,EAAM3yD,OAAQH,IAGhC,GAAIuU,EAFJ7Q,EAAQovD,EAAM9yD,GAEOA,EAAG8yD,GACtB,OAAOpvD,CAIb,CxBsEkB0B,CAAKyrD,EAAetpC,MAAM7mB,QAAQqyD,WAAW,SAAU7Q,GAGjE,MAAkB,iBAFNuC,EAAevC,EAAO,GACjB,EAEnB,KAAM,GACFH,EAAQ0C,EAAe5C,EAAO,GAClC+Q,EAAkB7Q,EAAM,EAC1B,CAqBA,OApBA8O,EAAe,eAAgB,MAAM,SAAUmC,EAAQ7sD,GAMrD0sD,EAAsB1sD,CACxB,KAIIqrD,GAAuB/L,EAAuBoL,IAChDA,EAAe,OAAQvY,EAAc,CACnCqa,MAAOA,EACPF,OAAQA,EACRQ,SAAS,GACRzB,IAIE,CACLhX,OAAQ,eACRyL,WAAYA,EACZ3E,cAAe,WAA0B,EACzC+E,UAAW,WACT,GAAKwK,EAAegB,gBAApB,CACA,IAAIx4C,EAAe,2HACnB,IACE,IAAI65C,EAAS7pC,SAASC,cAAc,UACpC4pC,EAAOC,OAAQ,EACfD,EAAOE,IAAM5N,EACb0N,EAAOG,QAAU,WACfxW,EAAsBn9C,KAAK,QAAS,IAAIW,MAAMgZ,GAChD,EACAgQ,SAASiqC,KAAKnjB,YAAY+iB,GAC1BrC,EAAegB,iBAAkB,CACnC,CAAE,MAAO0B,GACP1C,EAAegB,iBAAkB,EACjChV,EAAsBn9C,KAAK,QAAS,IAAIW,MAAMgZ,GAChD,CAd2C,CAe7C,EACAqtC,QAAS,WACPmK,EAAe,kBAAmB,uBAClC10C,EAAS0gC,EAAsB1gC,OAC/B81C,EAAoB,CAClB9rD,UAAWgW,EAAOvM,MAAMzJ,UACxB+a,eAAgB/E,EAAOvM,MAAMsR,gBAE/B/E,EAAOZ,0CAA0C+8B,EAAcA,EAAc,CAAC,EAAGn8B,EAAOvM,OAAQ,CAAC,EAAG,CAClGsR,gBAAgB,KAEb+kC,GACHpJ,EAAsBkE,iBAExB,IAAIyS,EAAuB,SAA8BrtD,GACvD,IAAIo0B,EAAYn6B,UAAUD,OAAS,QAAsBtB,IAAjBuB,UAAU,IAAmBA,UAAU,GAC/E,GAAK+F,EAAL,CAGA,IAAIstD,EAAgBt3C,EAAOvM,MAAMzJ,UAW5Bo0B,EAGHm5B,IAFApoC,WAAWooC,EAAY,EAbzB,CAEA,SAASA,IACPv3C,EAAOZ,0CAA0C+8B,EAAcA,EAAc,CAAC,EAAGn8B,EAAOvM,OAAQ,CAAC,EAAG,CAClGzJ,UAAWA,KAETstD,GAAiBA,IAAkBttD,GACrC02C,EAAsBkE,gBAE1B,CAQF,EACI4S,EAAqBxP,IACrBwP,GAGFH,EAAqBG,GAAoB,GAKvCd,GACFW,EAAqBX,GAAqB,GAC1ChC,EAAe,eAAgBgC,IACtBD,IACTY,EAAqBZ,GAAiB,GACtC/B,EAAe,eAAgB+B,IAIjC/B,EAAe,oBAAqB2C,EAAsB,CACxDj5B,WAAW,IAEb,IAAIq5B,EAAqC/C,EACrCpL,EAAuBoL,KACzB+C,EAAqC,SAA4C/jB,EAAQ9X,GASvF,OAAO84B,EAAehhB,EAAQ9X,EARZ,CAChBq6B,QAAS,CACP,2BAA4BO,EAC5B,oBAAqBF,IAM3B,GAEF5V,EAAsBsU,oBAAsB,SAAUn0C,GAChDy0C,EACFA,EAAQz0C,EAAO42C,GACN52C,EAAM62C,iBAEf72C,EAAM+a,QAAQ+7B,cAAgB,CAAC,iBACH,aAAxB92C,EAAM+2C,eACR/2C,EAAM+a,QAAQ+7B,cAAc9yD,KAAK,0BAEnC4yD,EAAmC52C,EAAM62C,eAAgB72C,EAAM+a,SAKnE,CACF,EACA4uB,YAAa,WACXkK,EAAe,yBAAqBhyD,GACpCg+C,EAAsBsU,oBAAsBxU,EAAA,EACxCxgC,GAAU81C,IACZ91C,EAAOZ,0CAA0C+8B,EAAcA,EAAc,CAAC,EAAGn8B,EAAOvM,OAAQqiD,IAChGpV,EAAsBkE,iBAE1B,EAEJ,CACF,CqBjDgBiT,CAAyB1C,GACrC,CAMA,OpBjKK9M,GAAmB,SAAU5f,GAClC,IAAIqvB,EAAmBC,EAEvB,OAAmD,QAA1CD,EADIrvB,EAAKxb,OACkBqb,iBAA6C,IAAtBwvB,GAAkG,QAAzDC,EAAwBD,EAAkBnvB,iBAAiD,IAA1BovB,OAA3E,EAAuHA,EAAsB/uD,QAAQ,qBAAuB,CACxQ,GAAG,CACDkoB,SAAU,WACR,OAAO,CACT,KoBsJEozB,EAAM4Q,IAAItL,EAAyB,CACjCE,YAAY,KAGTxF,CACT,CAkYA,OA3jBoB8G,EA8LPiI,EA9LoBxH,EA8LL,CAAC,CAC3BnmD,IAAK,mBACLitB,IAIA,WAEE,MAAuB,YAAhBpwB,KAAK4+C,MACd,GACC,CACDz7C,IAAK,MACL6B,MAAO,WAEL,IADA,IAAIu9C,EAASviD,KACJunC,EAAO7lC,UAAUD,OAAQ8oC,EAAa,IAAIxoC,MAAMwlC,GAAOC,EAAO,EAAGA,EAAOD,EAAMC,IACrF+C,EAAW/C,GAAQ9lC,UAAU8lC,GAE/B,IAAIiuB,EAAoBlrB,EAAWvhC,KAAI,SAAU/E,GAC/C,IAAIyxD,EAnNZ,SAAuBz1C,GAAU,IAAK,IAAI3e,EAAI,EAAGA,EAAII,UAAUD,OAAQH,IAAK,CAAE,IAAIwd,EAAS,MAAQpd,UAAUJ,GAAKI,UAAUJ,GAAK,CAAC,EAAGA,EAAI,EAAI,GAAQwE,OAAOgZ,IAAS,GAAIzW,SAAQ,SAAUlF,GAAO,GAAgB8c,EAAQ9c,EAAK2b,EAAO3b,GAAO,IAAK2C,OAAOg0C,0BAA4Bh0C,OAAOi0C,iBAAiB95B,EAAQna,OAAOg0C,0BAA0Bh7B,IAAW,GAAQhZ,OAAOgZ,IAASzW,SAAQ,SAAUlF,GAAO2C,OAAOk0C,eAAe/5B,EAAQ9c,EAAK2C,OAAO6zC,yBAAyB76B,EAAQ3b,GAAO,GAAI,CAAE,OAAO8c,CAAQ,CAmN7d,CAAc,CAChC67B,OAAQ,cACRyL,YAAY,EACZI,UAAW1J,EAAA,EACX+J,QAAS/J,EAAA,EACTgK,YAAahK,EAAA,EACb2E,cAAe3E,EAAA,GACdh6C,EAAG,CACJk6C,sBAAuBoE,KAMzB,OAJAA,EAAOhY,WAAWjoC,KAAK,CACrB+wD,QAASpvD,EACTsF,SAAUmsD,IAELA,CACT,IAUA,OANI11D,KAAKgoD,SACPyN,EAAkBptD,SAAQ,SAAUjG,GAClCA,EAAEulD,YACFvlD,EAAE4lD,SACJ,IAEKhoD,IACT,GAKC,CACDmD,IAAK,QACL6B,MAAO,WACL,IAAK,IAAI2wD,EAAQj0D,UAAUD,OAAQm0D,EAAoB,IAAI7zD,MAAM4zD,GAAQE,EAAQ,EAAGA,EAAQF,EAAOE,IACjGD,EAAkBC,GAASn0D,UAAUm0D,GAUvC,OARA71D,KAAKuqC,WAAWnkC,QAAO,SAAUhE,GAC/B,OAAOwzD,EAAkBxoB,SAAShrC,EAAEixD,QACtC,IAAGhrD,SAAQ,SAAUjG,GACnB,OAAOA,EAAEmH,SAAS0+C,aACpB,IACAjoD,KAAKuqC,WAAavqC,KAAKuqC,WAAWnkC,QAAO,SAAUhE,GACjD,OAAQwzD,EAAkBxoB,SAAShrC,EAAEixD,QACvC,IACOrzD,IACT,GAGC,CACDmD,IAAK,mBACL6B,MAAO,WAEL,OAAOhF,KAAK2yD,IAAI1wD,MAAMjC,KAAM0B,UAC9B,GASC,CACDyB,IAAK,YACL6B,MAAO,SAAmB+zC,GAExB,OAAO/4C,KAAK8hD,WAAW,CAAC/I,GAC1B,GAOC,CACD51C,IAAK,aACL6B,MAAO,SAAoB6zC,GACzB,IAAK92C,MAAMoF,QAAQ0xC,GACjB,MAAM,IAAIl3C,MAAMg+C,GAAU,iFAE5B,GAAI9G,EAAQj3B,MAAK,SAAUm3B,GACzB,MAA8B,oBAAhBA,EAAOiJ,MAAgD,oBAAlBjJ,EAAOkJ,MAC5D,IACE,MAAM,IAAItgD,MAAMg+C,GAAU,sEAG5B,OADA3/C,KAAK6iD,UAAUf,WAAWjJ,GACnB74C,IACT,GASC,CACDmD,IAAK,eACL6B,MAAO,SAAsB+zC,GAE3B,OAAO/4C,KAAKsiD,cAAc,CAACvJ,GAC7B,GAQC,CACD51C,IAAK,gBACL6B,MAAO,SAAuB6zC,GAC5B,IAAK92C,MAAMoF,QAAQ0xC,GACjB,MAAM,IAAIl3C,MAAMg+C,GAAU,uFAE5B,GAAI9G,EAAQj3B,MAAK,SAAUm3B,GACzB,MAAiC,oBAAnBA,EAAOlY,OACvB,IACE,MAAM,IAAIl/B,MAAMg+C,GAAU,sDAG5B,OADA3/C,KAAK6iD,UAAUP,cAAczJ,GACtB74C,IACT,GAQC,CACDmD,IAAK,QACL6B,MAAO,WACL,IAAI29C,EAAS3iD,KACb,GAAIA,KAAKgoD,QACP,MAAM,IAAIrmD,MAAMg+C,GAAU,qDAQ5B,IAAI37C,EAAahE,KAAKgE,YAAc,EAAoBhE,KAAK2D,OAAQ3D,KAAKub,WAY1E,GAXAvX,EAAWoV,OAAS,WASlB,OARAupC,EAAO/D,OAAS,UAChB+D,EAAOW,gBAAe,GAOft/C,EAAWuV,8BACpB,EACIvZ,KAAKwyD,gBAAiB,CAGxB,IAAIsD,EAAa,CACf18C,OAAQ,WACN,OAAO,IAAIkB,QAAQ2jC,EAAA,EACrB,GAEFj+C,KAAK+1D,kBAAoB/xD,EAAWoV,OAAO0E,KAAK9Z,GAChDA,EAAWoV,OAAS,WAClB,IAAI48C,EAAkBrT,EAAOE,UAAUxE,YACnC4X,EAAuB,EAAoBH,EAAYE,EAAgB9kD,MAAMtN,MAAOoyD,EAAgB9kD,OAYxG,OAXA+kD,EAAqBtzD,KAAK,UAAU,SAAU8/C,GAC5C,IAAIvxC,EAAQuxC,EAAMvxC,MAClB8kD,EAAgBn5C,0CAA0C3L,GAC1DyxC,EAAOoT,mBACT,IAEAE,EAAqBvzD,GAAG,UAAU,SAAUygD,GAC1C,IAAIjyC,EAAQiyC,EAAMjyC,MAClB8kD,EAAgBr5C,SAASzL,EAC3B,IACAyxC,EAAO6P,gBAAgByD,GAChBjyD,CACT,CACF,CAsCA,GAlCAA,EAAWtB,GAAG,SAAS,SAAU2gD,GAC/B,IAAI7hD,EAAQ6hD,EAAM7hD,MAClB,KAAMA,aAAiBG,OAAQ,CAE7B,IAAIC,EAAMJ,EACVA,EAAQsE,OAAOC,KAAKnE,GAAKoE,QAAO,SAAU8J,EAAK3M,GAE7C,OADA2M,EAAI3M,GAAOvB,EAAIuB,GACR2M,CACT,GAAG,IAAInO,MAAMC,EAAIs3C,SACnB,CAOA13C,EAAMA,MAAQA,EACdmhD,EAAOnhD,MAAQA,EACfmhD,EAAO/D,OAAS,QAChB+D,EAAOW,gBAAe,GAGtBX,EAAO3hD,KAAK,QAASQ,EACvB,IACAxB,KAAKgE,WAAaA,EAClBhE,KAAKuqC,WAAWliC,SAAQ,SAAUm7C,GACjBA,EAAMj6C,SACZo+C,WACX,IACA3nD,KAAK6iD,UAAUb,KAAK,CAClB7D,sBAAuBn+C,KACvBgS,OAAQ,KACRosC,QAASp+C,KAAKoiD,kBAEZpiD,KAAKkjD,gBAAiB,CACxB,IAAIgT,EAAyBl2D,KAAKqiD,eAIlCriD,KAAKqiD,eAAiB8M,GAAMlR,EAAA,GAM5BkR,IAAM,WACJxM,EAAON,eAAiB6T,CAC1B,GAFA/G,EAGF,MASSnvD,KAAK6iD,UAAUnC,aAAaj/C,OAAS,GAC5CzB,KAAKqiD,iBAKPriD,KAAKyd,OAASzd,KAAK6iD,UAAUxE,YAI7Br+C,KAAKgoD,SAAU,EACfhoD,KAAKuqC,WAAWliC,SAAQ,SAAU27C,GACjBA,EAAMz6C,SACZy+C,SACX,GACF,GAQC,CACD7kD,IAAK,UACL6B,MAAO,WACL,IAAImxD,EACJn2D,KAAKqiD,eAAekN,SACpBvvD,KAAKsjD,eAAeiM,SACpB5iC,aAAa3sB,KAAKsxD,qBAClBtxD,KAAKsiD,cAActiD,KAAK6iD,UAAUnC,cAClC1gD,KAAK6iD,UAAUhiB,UAKf7gC,KAAKgoD,SAAU,EAIfhoD,KAAKkD,qBACqC,QAAzCizD,EAAoBn2D,KAAKgE,kBAA8C,IAAtBmyD,GAAwCA,EAAkBjzD,qBAC5GlD,KAAKgE,WAAa,KAClBhE,KAAKyd,OAAS,KACdzd,KAAKuqC,WAAWliC,SAAQ,SAAUg8C,GACjBA,EAAM96C,SACZ0+C,aACX,GACF,GACC,CACD9kD,IAAK,wBACL6B,MAAO,WACL,IAAIy+C,EAASzjD,KACRA,KAAKsxD,sBACRtxD,KAAKsxD,oBAAsB1kC,YAAW,WACpC62B,EAAO7E,OAAS,UAChB6E,EAAOH,gBACT,GAAGtjD,KAAKuyD,qBAEZ,GAOC,CACDpvD,IAAK,aACL6B,MAAO,SAAoBo5C,GACzB,IAAIyF,EAAS7jD,KACTo2D,IAAoB10D,UAAUD,OAAS,QAAsBtB,IAAjBuB,UAAU,KAAmBA,UAAU,GACvF,IAAK1B,KAAKgE,WACR,MAAM,IAAIrC,MAAMg+C,GAAU,+DAK5B3/C,KAAK6iD,UAAUoB,iBACf,IAAIsN,EAAiC,oBAAZnT,EAAyBA,EAAQp+C,KAAK6iD,UAAU5C,iBAAiB,CAAC,IAAM7B,EAC7Fp+C,KAAK4iD,eAAiBwT,EACxBp2D,KAAK4iD,cAAc,CACjBxE,QAASmT,EACTzO,WAAY,SAAoB2M,GAC9BD,GAA4C,oBAAjBC,EAA8BA,EAAa8B,GAAe9B,EAAc5L,EAAOhB,WAC1GgB,EAAOxB,iBACPwB,EAAON,uBACT,KAGFiM,GAAoB+B,EAAavxD,KAAK6iD,WACtC7iD,KAAKqiD,iBACLriD,KAAKujD,wBAET,GACC,CACDpgD,IAAK,aACL6B,MAAO,WAKL,OAJIhF,KAAKgoD,SAEPhoD,KAAK6iD,UAAUoB,iBAEVjkD,KAAK6iD,UAAU5C,iBAAiB,CAAC,EAC1C,GACC,CACD98C,IAAK,YACL6B,MAAO,WACL,IAAI28C,EAAYjgD,UAAUD,OAAS,QAAsBtB,IAAjBuB,UAAU,GAAmBA,UAAU,GAAK,CAAC,EACrF,IAAK1B,KAAKgoD,QACR,MAAM,IAAIrmD,MAAMg+C,GAAU,8DAE5B,OAAO3/C,KAAK4hD,WAAWD,EACzB,GACC,CACDx+C,IAAK,UACL6B,MAAO,WACL,IAAKhF,KAAKgE,WACR,MAAM,IAAIrC,MAAMg+C,GAAU,4DAE5B3/C,KAAKgE,WAAWua,aAAanF,QAC/B,IAzjB8DkwC,GAAY,GAAkBT,EAAYnoD,UAAW4oD,GAAiBC,GAAa,GAAkBV,EAAaU,GAAczjD,OAAOk0C,eAAe6O,EAAa,YAAa,CAAElpC,UAAU,IA2jBrPmxC,CACT,CAthBiC,CAshB/B,GACF,kBIlkBA,2DCSIuF,GAAoB,CAAC,UAAUjxD,OAAO,UAAc,KAAM,wBAAwBA,OAAO,GAAS,KAAM,6BAA6BA,OAAO,GAAS,MACrJkxD,GAAkB,+BAA+BlxD,OAAO,GAAS,KACjEmxD,GAAgB,SAAuBC,GACzC,OAAOA,EAAc,YAAYpxD,OAAOoxD,EAAa,KAAO,IAC9D,EAiJA,SAASC,GAAiBxE,EAAcyE,GACM,oBAAjCzE,EAAav5C,iBAGxBg+C,EAAWtwD,OAAOG,SAAS8B,SAAQ,SAAU+9B,GAC3C6rB,EAAav5C,gBAAgB0tB,EAC/B,GACF,CCrKA,IAAI,GAAY,CAAC,YACjB,SAAS,GAAyBtnB,EAAQyB,GAAY,GAAc,MAAVzB,EAAgB,MAAO,CAAC,EAAG,IAAkE3b,EAAK7B,EAAnE2e,EACzF,SAAuCnB,EAAQyB,GAAY,GAAc,MAAVzB,EAAgB,MAAO,CAAC,EAAG,IAA2D3b,EAAK7B,EAA5D2e,EAAS,CAAC,EAAOO,EAAa1a,OAAOC,KAAK+Y,GAAqB,IAAKxd,EAAI,EAAGA,EAAIkf,EAAW/e,OAAQH,IAAO6B,EAAMqd,EAAWlf,GAAQif,EAAS9Z,QAAQtD,IAAQ,IAAa8c,EAAO9c,GAAO2b,EAAO3b,IAAQ,OAAO8c,CAAQ,CADhN,CAA8BnB,EAAQyB,GAAuB,GAAIza,OAAO0zC,sBAAuB,CAAE,IAAI+C,EAAmBz2C,OAAO0zC,sBAAsB16B,GAAS,IAAKxd,EAAI,EAAGA,EAAIi7C,EAAiB96C,OAAQH,IAAO6B,EAAMo5C,EAAiBj7C,GAAQif,EAAS9Z,QAAQtD,IAAQ,GAAkB2C,OAAOpF,UAAU87C,qBAAqB16C,KAAKgd,EAAQ3b,KAAgB8c,EAAO9c,GAAO2b,EAAO3b,GAAQ,CAAE,OAAO8c,CAAQ,CAMpe,SAAS,GAAcimB,GAC5B,IAAIvvB,EAAWuvB,EAAKvvB,SAEhByC,EDIC,SAA6BklB,GAClC,IAiLIq4B,EAAQC,EAjLRC,GAAc,EAAAC,GAAA,KACdC,GAAgB,EAAAC,GAAA,KAChBC,GAAc,EAAAC,GAAA,KACdC,GAAuB,EAAAC,GAAA,KACvBC,EAAiC,OAAhBJ,QAAwC,IAAhBA,OAAyB,EAASA,EAAYI,eACvFC,GAAe,IAAAC,QAAOj5B,GACtBk5B,EAAqBT,GAAiBM,GAAkBF,EACxDM,GAAY,IAAAF,QAAO,MAOvB,GAHIN,IACFQ,EAAYR,EAAYS,cAEA,OAAtBD,EAAUvhC,QAAkB,CAI9B,IAAI9c,EAAS,IAAI,GAAcklB,GAC/BllB,EAAOu+C,UAAY,SAAmBh+C,GACpCP,EAAOu+C,UAAU9uC,MAAMvmB,KAAKqX,GAC5BgT,aAAavT,EAAOu+C,UAAUC,OAC9Bx+C,EAAOu+C,UAAUC,MAAQhrC,YAAW,WAClCxT,EAAOu+C,UAAU9uC,MAAMxgB,SAAQ,SAAUi/B,GACvCA,GACF,IACAluB,EAAOu+C,UAAU9uC,MAAQ,EAC3B,GAAG,EACL,EACAzP,EAAOu+C,UAAU9uC,MAAQ,GACrB2uC,IAOFp+C,EAAO8pC,gBAAkBmU,GAAkB,CAAC,GAE9CZ,GAAiBn4B,EAAM2zB,aAAc,GAAG7sD,OAAOixD,GAAmB,CAACU,GAAiBT,GAAiBC,GA2I9E,qBAAX7rC,SAAsD,QAA1BisC,EAASjsC,OAAO87B,YAA6B,IAAXmQ,OAAoB,EAASA,EAAO7yD,WAAgC,qBAAZw2B,QAA2D,QAAhCs8B,EAAet8B,QAAQC,WAAkC,IAAjBq8B,OAA0B,EAASA,EAAaiB,kBAAe13D,OAtIhQq3D,GACFp+C,EAAO4T,QAEL+pC,GAGFA,EAAce,aAAa,CACzB1+C,OAAQA,IAGGklB,EAAMqzB,QACNprD,QAAQ4wD,GACvBM,EAAUvhC,QAAU9c,CACtB,CAEE,IAwBM2+C,EAxBF1+C,EAAUo+C,EAAUvhC,QACpB8hC,EAAYV,EAAaphC,QACzB8hC,EAAUz8C,YAAc+iB,EAAM/iB,YAChClC,EAAQoE,OAAOjT,SAAS8zB,EAAM/iB,WAAa,IAAInC,SAC/Ck+C,EAAaphC,QAAUoI,GAErB05B,EAAU/F,eAAiB3zB,EAAM2zB,eAEnCwE,GAAiBn4B,EAAM2zB,aAAc,GAAG7sD,OAAOixD,GAAmB,CAACU,GAAiBT,MACpFj9C,EAAQrV,WAAW2U,UAAU2lB,EAAM2zB,cAAc74C,SACjDk+C,EAAaphC,QAAUoI,GAErB05B,EAAUpV,gBAAkBtkB,EAAMskB,gBACpCvpC,EAAQupC,cAAgBtkB,EAAMskB,cAC9B0U,EAAaphC,QAAUoI,GAErB05B,EAAUnG,iBAAmBvzB,EAAMuzB,iBAIrCx4C,EAAQm5C,gBAAkBl0B,EAAMuzB,eAChCyF,EAAaphC,QAAUoI,GAErB05B,EAAUjG,qBAAuBzzB,EAAMyzB,qBAIzC14C,EAAQk5C,oBAA6E,QAAtDwF,EAAwBz5B,EAAMyzB,0BAA0D,IAA1BgG,EAAmCA,EAAwB,IACxJT,EAAaphC,QAAUoI,GAY3B,IAAI25B,GAAkB,IAAAV,QAAO,MACzBW,GAAQ,KAAAptC,uBAAqB,IAAAqtC,cAAY,WAC3C,IAAI/+C,EAASq+C,EAAUvhC,QAiBvB,OAdgC,OAA5B+hC,EAAgB/hC,QAEb9c,EAAO4uC,UACV5uC,EAAO4T,QACP6pC,MAOFlqC,aAAasrC,EAAgB/hC,SAC7B9c,EAAOg/C,uBAAwB,GAE1B,WAILzrC,aAAavT,EAAOu+C,UAAUC,OAO9BK,EAAgB/hC,QAAUtJ,YAV1B,WACExT,EAAOynB,SACT,IAaAznB,EAAOg/C,uBAAwB,CACjC,CACF,GAAG,CAACvB,KAAe,WACjB,OAAOY,EAAUvhC,OACnB,IAAG,WACD,OAAOuhC,EAAUvhC,OACnB,IACA,OAAOgiC,CACT,CCnJeG,CADH,GAAyBnyB,EAAM,KAEzC,OAAK9sB,EAAO4uC,QAGQ,gBAAoBsQ,EAAA,EAAqBn+B,SAAU,CACrEn1B,MAAOoU,GACO,gBAAoBm/C,EAAA,EAAap+B,SAAU,CACzDn1B,MAAOoU,EAAOypC,WACblsC,IANM,IAOX,sHCnBA,SAASovC,EAAe/+B,EAAK1lB,GAAK,OAKlC,SAAyB0lB,GAAO,GAAIjlB,MAAMoF,QAAQ6f,GAAM,OAAOA,CAAK,CAL3Bg/B,CAAgBh/B,IAIzD,SAA+BA,EAAK1lB,GAAK,IAAI2kD,EAAK,MAAQj/B,EAAM,KAAO,oBAAsB0C,QAAU1C,EAAI0C,OAAO0vB,WAAapyB,EAAI,cAAe,GAAI,MAAQi/B,EAAI,CAAE,IAAIC,EAAIC,EAAIC,EAAIC,EAAIC,EAAO,GAAIC,GAAK,EAAIl7B,GAAK,EAAI,IAAM,GAAI+6B,GAAMH,EAAKA,EAAGnkD,KAAKklB,IAAMw/B,KAAM,IAAMllD,EAAG,CAAE,GAAIwE,OAAOmgD,KAAQA,EAAI,OAAQM,GAAK,CAAI,MAAO,OAASA,GAAML,EAAKE,EAAGtkD,KAAKmkD,IAAKQ,QAAUH,EAAKhkD,KAAK4jD,EAAGlhD,OAAQshD,EAAK7kD,SAAWH,GAAIilD,GAAK,GAAK,CAAE,MAAO3kD,GAAOypB,GAAK,EAAI86B,EAAKvkD,CAAK,CAAE,QAAU,IAAM,IAAK2kD,GAAM,MAAQN,EAAGS,SAAWL,EAAKJ,EAAGS,SAAU5gD,OAAOugD,KAAQA,GAAK,MAAQ,CAAE,QAAU,GAAIh7B,EAAI,MAAM86B,CAAI,CAAE,CAAE,OAAOG,CAAM,CAAE,CAJ1gBK,CAAsB3/B,EAAK1lB,IAE5F,SAAqCwnB,EAAG02B,GAAU,IAAK12B,EAAG,OAAQ,GAAiB,kBAANA,EAAgB,OAAOs2B,EAAkBt2B,EAAG02B,GAAS,IAAI3+C,EAAIiF,OAAOpF,UAAUqQ,SAASjP,KAAKgnB,GAAG9mB,MAAM,GAAI,GAAc,WAANnB,GAAkBioB,EAAE3e,cAAatJ,EAAIioB,EAAE3e,YAAYP,MAAM,GAAU,QAAN/I,GAAqB,QAANA,EAAa,OAAOkB,MAAM8wB,KAAK/J,GAAI,GAAU,cAANjoB,GAAqB,2CAA2CyiB,KAAKziB,GAAI,OAAOu+C,EAAkBt2B,EAAG02B,EAAS,CAF7TC,CAA4Bz4B,EAAK1lB,IACnI,WAA8B,MAAM,IAAIP,UAAU,4IAA8I,CADvD6lD,EAAoB,CAG7J,SAASxH,EAAkBp4B,EAAK5lB,IAAkB,MAAPA,GAAeA,EAAM4lB,EAAIvlB,UAAQL,EAAM4lB,EAAIvlB,QAAQ,IAAK,IAAIH,EAAI,EAAGwe,EAAO,IAAI/d,MAAMX,GAAME,EAAIF,EAAKE,IAAKwe,EAAKxe,GAAK0lB,EAAI1lB,GAAI,OAAOwe,CAAM,CAGlL,SAASq5B,EAAQ74B,GAAkC,OAAO64B,EAAU,mBAAqBzvB,QAAU,iBAAmBA,OAAO0vB,SAAW,SAAU94B,GAAO,cAAcA,CAAK,EAAI,SAAUA,GAAO,OAAOA,GAAO,mBAAqBoJ,QAAUpJ,EAAInW,cAAgBuf,QAAUpJ,IAAQoJ,OAAOhpB,UAAY,gBAAkB4f,CAAK,EAAG64B,EAAQ74B,EAAM,CAUxU,SAASk4C,EAA2BtyB,GACzC,IAAItiC,EAAQsiC,EAAKtiC,MACfwjD,EAAalhB,EAAKkhB,WAElB/lD,GADa6kC,EAAKuyB,WACXvyB,EAAK7kC,MACZ88C,EAAwBjY,EAAKiY,sBAE/B,GAAoB,IAAhB98C,EAAKI,QAAqC,WAArB03C,EAAQ93C,EAAK,IACpC,MAAO,CAACA,EAAK,IAEf,IACEq3D,EAAiB3S,EADC1kD,EAAK,GAAGuP,MAAM,KACe,GAC/C+nD,EAAYD,EAAe,GAC3BrD,EAAgBqD,EAAe,GAC7B1d,EAAO35C,EAAK,GACZu3D,EAAYv3D,EAAK,GACrB,IAAK25C,EAID,MAAO,GAGX,IAAmB,UAAd2d,GAAuC,eAAdA,KAAgCC,EAI1D,MAAO,GAGX,IAAIC,EAAY92D,MAAMoF,QAAQ6zC,GAAQA,EAAO,CAACA,GAC9C,GAAyB,IAArB6d,EAAUp3D,OACZ,MAAO,GAET,IAAIq3D,EAAUD,EAAU,GAAGE,UACvBC,EA3CN,SAAehyC,GAGb,IAFA,IAAIiyC,EAAYv3D,UAAUD,OAAS,QAAsBtB,IAAjBuB,UAAU,GAAmBA,UAAU,GAAK,GAChFw3D,EAAS,GACJ53D,EAAI,EAAGA,EAAIuqB,KAAK0jB,KAAKvoB,EAAIvlB,OAASw3D,GAAY33D,IACrD43D,EAAO52D,KAAK0kB,EAAIhlB,MAAMV,EAAI23D,GAAY33D,EAAI,GAAK23D,IAEjD,OAAOC,CACT,CAoCmBC,CAAMN,GACnBO,EAAmBJ,EAAWhwD,KAAI,SAAUqwD,GAC9C,OAAOA,EAAMrwD,KAAI,SAAUkyC,GACzB,OAAOA,EAAI+T,QACb,GACF,IACIqK,EAAmBN,EAAWhwD,KAAI,SAAUqwD,GAC9C,OAAOA,EAAMrwD,KAAI,SAAUkyC,GACzB,OAAOA,EAAIqe,UACb,GACF,IACA,MAAkB,SAAdZ,EACmC,SAAjCxa,EAAsBS,OACjB,GAEFoa,EAAWhwD,KAAI,SAAUqwD,EAAO/3D,GACrC,MAAO,CACL6zD,eAAgB,kBAChB/N,WAAYA,EACZuR,UAAWA,EACXt/B,QAAS,CACPu/B,UAAWA,GAAa,cACxBh1D,MAAOA,EACPorD,UAAWoK,EAAiB93D,IAE9B05C,KAAMqe,EACNhE,cAAeA,EAEnB,IACuB,UAAdsD,EACFK,EAAWhwD,KAAI,SAAUqwD,EAAO/3D,GACrC,MAAO,CACL6zD,eAAgB,8BAChB/N,WAAYA,EACZuR,UAAWA,EACXt/B,QAAS,CACPu/B,UAAWA,GAAa,cACxBh1D,MAAOA,EACPk1D,QAASA,EACT9J,UAAWoK,EAAiB93D,GAC5Bk4D,UAAWF,EAAiBh4D,IAE9B05C,KAAMqe,EACNhE,cAAeA,EAEnB,IACuB,eAAdsD,EACFK,EAAWhwD,KAAI,SAAUqwD,EAAO/3D,GACrC,MAAO,CACL6zD,eAAgB,gCAChB/N,WAAYA,EACZuR,UAAWA,EACXt/B,QAAS,CACPu/B,UAAWA,GAAa,gBACxBh1D,MAAOA,EACPk1D,QAASA,EACT9J,UAAWoK,EAAiB93D,IAE9B05C,KAAMqe,EACNhE,cAAeA,EAEnB,IAIO,EAEX,gBCtHA,SAAS,EAAQ/0C,GAAkC,OAAO,EAAU,mBAAqBoJ,QAAU,iBAAmBA,OAAO0vB,SAAW,SAAU94B,GAAO,cAAcA,CAAK,EAAI,SAAUA,GAAO,OAAOA,GAAO,mBAAqBoJ,QAAUpJ,EAAInW,cAAgBuf,QAAUpJ,IAAQoJ,OAAOhpB,UAAY,gBAAkB4f,CAAK,EAAG,EAAQA,EAAM,CAC/U,SAASg5B,EAAQl4B,EAAQm4B,GAAkB,IAAIxzC,EAAOD,OAAOC,KAAKqb,GAAS,GAAItb,OAAO0zC,sBAAuB,CAAE,IAAIC,EAAU3zC,OAAO0zC,sBAAsBp4B,GAASm4B,IAAmBE,EAAUA,EAAQrzC,QAAO,SAAUszC,GAAO,OAAO5zC,OAAO6zC,yBAAyBv4B,EAAQs4B,GAAKh6B,UAAY,KAAK3Z,EAAKzD,KAAKL,MAAM8D,EAAM0zC,EAAU,CAAE,OAAO1zC,CAAM,CACpV,SAAS6zC,EAAc35B,GAAU,IAAK,IAAI3e,EAAI,EAAGA,EAAII,UAAUD,OAAQH,IAAK,CAAE,IAAIwd,EAAS,MAAQpd,UAAUJ,GAAKI,UAAUJ,GAAK,CAAC,EAAGA,EAAI,EAAIg4C,EAAQxzC,OAAOgZ,IAAS,GAAIzW,SAAQ,SAAUlF,GAAO02C,EAAgB55B,EAAQ9c,EAAK2b,EAAO3b,GAAO,IAAK2C,OAAOg0C,0BAA4Bh0C,OAAOi0C,iBAAiB95B,EAAQna,OAAOg0C,0BAA0Bh7B,IAAWw6B,EAAQxzC,OAAOgZ,IAASzW,SAAQ,SAAUlF,GAAO2C,OAAOk0C,eAAe/5B,EAAQ9c,EAAK2C,OAAO6zC,yBAAyB76B,EAAQ3b,GAAO,GAAI,CAAE,OAAO8c,CAAQ,CACzf,SAAS45B,EAAgBv5B,EAAKnd,EAAK6B,GAA4L,OAAnL7B,EAC5C,SAAwB9C,GAAO,IAAI8C,EACnC,SAAsB82C,EAAOC,GAAQ,GAAuB,WAAnB,EAAQD,IAAiC,OAAVA,EAAgB,OAAOA,EAAO,IAAIE,EAAOF,EAAMvwB,OAAO0wB,aAAc,QAAaj6C,IAATg6C,EAAoB,CAAE,IAAIhiC,EAAMgiC,EAAKr4C,KAAKm4C,EAAOC,GAAQ,WAAY,GAAqB,WAAjB,EAAQ/hC,GAAmB,OAAOA,EAAK,MAAM,IAAIpX,UAAU,+CAAiD,CAAE,OAAiB,WAATm5C,EAAoBn7B,OAASs7B,QAAQJ,EAAQ,CADnVK,CAAaj6C,EAAK,UAAW,MAAwB,WAAjB,EAAQ8C,GAAoBA,EAAM4b,OAAO5b,EAAM,CAD1Eo3C,CAAep3C,MAAiBmd,EAAOxa,OAAOk0C,eAAe15B,EAAKnd,EAAK,CAAE6B,MAAOA,EAAO0a,YAAY,EAAME,cAAc,EAAMD,UAAU,IAAkBW,EAAInd,GAAO6B,EAAgBsb,CAAK,CCH3O,SAAS,EAAQA,GAAkC,OAAO,EAAU,mBAAqBoJ,QAAU,iBAAmBA,OAAO0vB,SAAW,SAAU94B,GAAO,cAAcA,CAAK,EAAI,SAAUA,GAAO,OAAOA,GAAO,mBAAqBoJ,QAAUpJ,EAAInW,cAAgBuf,QAAUpJ,IAAQoJ,OAAOhpB,UAAY,gBAAkB4f,CAAK,EAAG,EAAQA,EAAM,CAC/U,SAAS,EAAQc,EAAQm4B,GAAkB,IAAIxzC,EAAOD,OAAOC,KAAKqb,GAAS,GAAItb,OAAO0zC,sBAAuB,CAAE,IAAIC,EAAU3zC,OAAO0zC,sBAAsBp4B,GAASm4B,IAAmBE,EAAUA,EAAQrzC,QAAO,SAAUszC,GAAO,OAAO5zC,OAAO6zC,yBAAyBv4B,EAAQs4B,GAAKh6B,UAAY,KAAK3Z,EAAKzD,KAAKL,MAAM8D,EAAM0zC,EAAU,CAAE,OAAO1zC,CAAM,CACpV,SAAS,EAAcka,GAAU,IAAK,IAAI3e,EAAI,EAAGA,EAAII,UAAUD,OAAQH,IAAK,CAAE,IAAIwd,EAAS,MAAQpd,UAAUJ,GAAKI,UAAUJ,GAAK,CAAC,EAAGA,EAAI,EAAI,EAAQwE,OAAOgZ,IAAS,GAAIzW,SAAQ,SAAUlF,GAAO,EAAgB8c,EAAQ9c,EAAK2b,EAAO3b,GAAO,IAAK2C,OAAOg0C,0BAA4Bh0C,OAAOi0C,iBAAiB95B,EAAQna,OAAOg0C,0BAA0Bh7B,IAAW,EAAQhZ,OAAOgZ,IAASzW,SAAQ,SAAUlF,GAAO2C,OAAOk0C,eAAe/5B,EAAQ9c,EAAK2C,OAAO6zC,yBAAyB76B,EAAQ3b,GAAO,GAAI,CAAE,OAAO8c,CAAQ,CACzf,SAAS,EAAgBK,EAAKnd,EAAK6B,GAA4L,OAAnL7B,EAC5C,SAAwB9C,GAAO,IAAI8C,EACnC,SAAsB82C,EAAOC,GAAQ,GAAuB,WAAnB,EAAQD,IAAiC,OAAVA,EAAgB,OAAOA,EAAO,IAAIE,EAAOF,EAAMvwB,OAAO0wB,aAAc,QAAaj6C,IAATg6C,EAAoB,CAAE,IAAIhiC,EAAMgiC,EAAKr4C,KAAKm4C,EAAOC,GAAQ,WAAY,GAAqB,WAAjB,EAAQ/hC,GAAmB,OAAOA,EAAK,MAAM,IAAIpX,UAAU,+CAAiD,CAAE,OAAiB,WAATm5C,EAAoBn7B,OAASs7B,QAAQJ,EAAQ,CADnV,CAAa55C,EAAK,UAAW,MAAwB,WAAjB,EAAQ8C,GAAoBA,EAAM4b,OAAO5b,EAAM,CAD1E,CAAeA,MAAiBmd,EAAOxa,OAAOk0C,eAAe15B,EAAKnd,EAAK,CAAE6B,MAAOA,EAAO0a,YAAY,EAAME,cAAc,EAAMD,UAAU,IAAkBW,EAAInd,GAAO6B,EAAgBsb,CAAK,CCH3O,SAAS,EAAQA,GAAkC,OAAO,EAAU,mBAAqBoJ,QAAU,iBAAmBA,OAAO0vB,SAAW,SAAU94B,GAAO,cAAcA,CAAK,EAAI,SAAUA,GAAO,OAAOA,GAAO,mBAAqBoJ,QAAUpJ,EAAInW,cAAgBuf,QAAUpJ,IAAQoJ,OAAOhpB,UAAY,gBAAkB4f,CAAK,EAAG,EAAQA,EAAM,CAC/U,SAAS,EAAQc,EAAQm4B,GAAkB,IAAIxzC,EAAOD,OAAOC,KAAKqb,GAAS,GAAItb,OAAO0zC,sBAAuB,CAAE,IAAIC,EAAU3zC,OAAO0zC,sBAAsBp4B,GAASm4B,IAAmBE,EAAUA,EAAQrzC,QAAO,SAAUszC,GAAO,OAAO5zC,OAAO6zC,yBAAyBv4B,EAAQs4B,GAAKh6B,UAAY,KAAK3Z,EAAKzD,KAAKL,MAAM8D,EAAM0zC,EAAU,CAAE,OAAO1zC,CAAM,CACpV,SAAS,EAAcka,GAAU,IAAK,IAAI3e,EAAI,EAAGA,EAAII,UAAUD,OAAQH,IAAK,CAAE,IAAIwd,EAAS,MAAQpd,UAAUJ,GAAKI,UAAUJ,GAAK,CAAC,EAAGA,EAAI,EAAI,EAAQwE,OAAOgZ,IAAS,GAAIzW,SAAQ,SAAUlF,GAAO,EAAgB8c,EAAQ9c,EAAK2b,EAAO3b,GAAO,IAAK2C,OAAOg0C,0BAA4Bh0C,OAAOi0C,iBAAiB95B,EAAQna,OAAOg0C,0BAA0Bh7B,IAAW,EAAQhZ,OAAOgZ,IAASzW,SAAQ,SAAUlF,GAAO2C,OAAOk0C,eAAe/5B,EAAQ9c,EAAK2C,OAAO6zC,yBAAyB76B,EAAQ3b,GAAO,GAAI,CAAE,OAAO8c,CAAQ,CACzf,SAAS,EAAgBK,EAAKnd,EAAK6B,GAA4L,OAAnL7B,EAC5C,SAAwB9C,GAAO,IAAI8C,EACnC,SAAsB82C,EAAOC,GAAQ,GAAuB,WAAnB,EAAQD,IAAiC,OAAVA,EAAgB,OAAOA,EAAO,IAAIE,EAAOF,EAAMvwB,OAAO0wB,aAAc,QAAaj6C,IAATg6C,EAAoB,CAAE,IAAIhiC,EAAMgiC,EAAKr4C,KAAKm4C,EAAOC,GAAQ,WAAY,GAAqB,WAAjB,EAAQ/hC,GAAmB,OAAOA,EAAK,MAAM,IAAIpX,UAAU,+CAAiD,CAAE,OAAiB,WAATm5C,EAAoBn7B,OAASs7B,QAAQJ,EAAQ,CADnV,CAAa55C,EAAK,UAAW,MAAwB,WAAjB,EAAQ8C,GAAoBA,EAAM4b,OAAO5b,EAAM,CAD1E,CAAeA,MAAiBmd,EAAOxa,OAAOk0C,eAAe15B,EAAKnd,EAAK,CAAE6B,MAAOA,EAAO0a,YAAY,EAAME,cAAc,EAAMD,UAAU,IAAkBW,EAAInd,GAAO6B,EAAgBsb,CAAK,CAI3O,IAAIq/B,GAAY,OAAoC,CAClD/1C,KAAM,OACNqvC,WAAW,IAgGb,EA9FkB,SAAqBuL,GACrC,IAAIC,EAAY/iD,UAAUD,OAAS,QAAsBtB,IAAjBuB,UAAU,GAAmBA,UAAU,GAAKu8C,EAAA,EAEpF,OADA,EAAAxF,EAAA,GAAe+L,EAAU7E,KAClB,SAAUmB,GACf,IAOI2Y,EACAC,EARAxzB,EAAO4a,GAAgB,CAAC,EAC1B6Y,EAAkBzzB,EAAK0zB,WACvBA,OAAiC,IAApBD,GAAoCA,EACjDE,EAAsB3zB,EAAK4zB,eAC3BA,OAAyC,IAAxBD,EAAiC,SAAUzF,GAC1D,OAAOA,CACT,EAAIyF,EAGN,MAAO,CACL/d,OAAQ,WACRkG,KAAM,SAAc2C,GAClBH,EAAS,EAAc,EAAc,CAAC,EAAGxkD,KAAK4kD,qBAAqBD,IAAe,CAAC,EAAG,CACpFxG,sBAAuBwG,EAAYxG,yBACjC,EACN,EACA8D,OAAQ,SAAgB4C,GACtB,IAAIvG,EAAct+C,KAAK4kD,qBAAqBC,GAC5CL,EAAS,EAAc,EAAc,CAAC,EAAGlG,GAAc,CAAC,EAAG,CACzDH,sBAAuB0G,EAAc1G,yBACnC,GACJG,EAAYmb,UAAU,gBAAiBnb,EAAYtD,KACrD,EACAkH,eAAgB,SAAwB5D,EAAauG,GACnD,OAAO,EAAc,EAAc,CAAC,EAAGvG,GAAc,CAAC,EAAG,CACvDtD,KAAMh7C,KAAK4kD,qBAAqBC,IAEpC,EACAD,qBAAsB,SAA8BnC,GAClD,IAAIvvC,EAAUuvC,EAAMvvC,QAClBuK,EAASglC,EAAMhlC,OACf0gC,EAAwBsE,EAAMtE,sBAehC,GAdKsb,IACHA,EHuEH,SAAgChX,GACrC,IAAItE,EAAwBsE,EAAMtE,sBAChCv6C,EAAQ6+C,EAAM7+C,MACdwjD,EAAa3E,EAAM2E,WACjB2S,EAAa,CAAC,EACdnC,OAAQz3D,EAwBZ,OAvBuB,WACrB,IAAK,IAAIonC,EAAO7lC,UAAUD,OAAQJ,EAAO,IAAIU,MAAMwlC,GAAOC,EAAO,EAAGA,EAAOD,EAAMC,IAC/EnmC,EAAKmmC,GAAQ9lC,UAAU8lC,GAEVgxB,EAA2B,CACxCpR,WAAYA,EACZxjD,MAAOA,EACP60D,WAAY,YACZp3D,KAAMA,EACN88C,sBAAuBA,IAEhB91C,SAAQ,SAAUgxB,GACC,UAAtBA,EAAQs/B,WAAmD,aAA1Bt/B,EAAQg8B,eAAgC0E,EAAW1gC,EAAQs/B,aAGhGoB,EAAW1gC,EAAQs/B,YAAa,EAChCxa,EAAsBsU,oBAAoBp5B,GAC5C,IACA1M,aAAairC,GACbA,EAAQhrC,YAAW,WACjBmtC,EAAa,CAAC,CAChB,GAAG,EACL,CAEF,CGrGsBC,CAAuB,CACjC7b,sBAAuBA,EACvBv6C,MAAO6Z,EAAOP,WACdkqC,WAAYpnD,KAAK87C,UAGhB4d,IACHA,EH+FH,SAAgCvW,GACrC,IAAIv/C,EAAQu/C,EAAMv/C,MAChBwjD,EAAajE,EAAMiE,WACnBjJ,EAAwBgF,EAAMhF,sBAchC,OAbuB,WACrB,IAAK,IAAIwX,EAAQj0D,UAAUD,OAAQJ,EAAO,IAAIU,MAAM4zD,GAAQE,EAAQ,EAAGA,EAAQF,EAAOE,IACpFx0D,EAAKw0D,GAASn0D,UAAUm0D,GAE1B,IAAIoE,EAAWzB,EAA2B,CACxCpR,WAAYA,EACZxjD,MAAOA,EACP60D,WAAY,YACZp3D,KAAMA,EACN88C,sBAAuBA,IAEzB,OAAO8b,EAASx4D,OAAS,uBAAuB2D,QAAO,OAAiB60D,IAAa,EACvF,CAEF,CGjHsBC,CAAuB,CACjCt2D,MAAO6Z,EAAOP,WACdkqC,WAAYpnD,KAAK87C,OACjBqC,sBAAuBA,MAGtBjrC,EACH,MAAO,CACL8nC,KAAM,GACN9nC,aAAS/S,EACTs5D,UAAWA,EACXC,UAAWA,EACX5Y,aAAcA,GAGd8Y,GAAc1mD,EAAQ8nC,KAAKv5C,OAAS,IACtCyR,EAAQ8nC,MAAO,QAAW9nC,EAAQ8nC,OAEpC,IFnE4BA,EAAMlwC,EAAMI,EEoEpCivD,EDpEL,SAAoBnf,EAAM8d,GAC/B,OAAKA,EAGE9d,EAAKhyC,KAAI,SAAUkyC,GACxB,OAAO,EAAc,EAAc,CAAC,EAAGA,GAAM,CAAC,EAAG,CAC/C6d,UAAWD,GAEf,IANS9d,CAOX,CC2DiDof,EFpEbpf,EEmEuB9nC,EAAQ8nC,KFnEzBlwC,EEmE+BoI,EAAQpI,KFnEjCI,EEmEuCgI,EAAQhI,YFlEtF8vC,EAAKhyC,KAAI,SAAUkyC,EAAKxnC,GAC7B,OAAOkmC,EAAcA,EAAc,CAAC,EAAGsB,GAAM,CAAC,EAAG,CAC/Cqe,WAAYruD,EAAcJ,EAAO4I,EAAM,GAE3C,KE+DoFR,EAAQ4lD,SAItF,MAAO,CACL9d,KAJoB8e,EAAeK,EAAoC,CACvEjnD,QAASA,IAITA,QAASA,EACTumD,UAAWA,EACXC,UAAWA,EACX5Y,aAAcA,EAElB,EACAjgB,QAAS,SAAiBsiB,GACxB,IAAIjyC,EAAQiyC,EAAMjyC,MAElB,OADAuzC,IACKmV,EAGE1oD,EAAM5G,mBAAmBxE,OAAOC,KAAK,MAAiBC,QAAO,SAAU8J,EAAK3M,GACjF,OAAO,EAAc,EAAc,CAAC,EAAG2M,GAAM,CAAC,EAAG,EAAgB,CAAC,EAAG3M,OAAKhD,GAC5E,GAAG,CAAC,IAJK+Q,CAKX,EACAovC,0BAA2B,SAAmCpvC,GAC5D,OAAK0oD,EAGE1oD,EAAM5G,mBAAmB,MAFvB4G,CAGX,EAEJ,CACF,aCtGO,SAASmpD,EAAQ/7B,EAAO+mB,GAC7B,OAAO,EAAAC,EAAA,GAAa,EAAahnB,EAAO+mB,EAC1C,2GCJA,SAASlM,EAAQ74B,GAAkC,OAAO64B,EAAU,mBAAqBzvB,QAAU,iBAAmBA,OAAO0vB,SAAW,SAAU94B,GAAO,cAAcA,CAAK,EAAI,SAAUA,GAAO,OAAOA,GAAO,mBAAqBoJ,QAAUpJ,EAAInW,cAAgBuf,QAAUpJ,IAAQoJ,OAAOhpB,UAAY,gBAAkB4f,CAAK,EAAG64B,EAAQ74B,EAAM,CAC/U,SAASg5B,EAAQl4B,EAAQm4B,GAAkB,IAAIxzC,EAAOD,OAAOC,KAAKqb,GAAS,GAAItb,OAAO0zC,sBAAuB,CAAE,IAAIC,EAAU3zC,OAAO0zC,sBAAsBp4B,GAASm4B,IAAmBE,EAAUA,EAAQrzC,QAAO,SAAUszC,GAAO,OAAO5zC,OAAO6zC,yBAAyBv4B,EAAQs4B,GAAKh6B,UAAY,KAAK3Z,EAAKzD,KAAKL,MAAM8D,EAAM0zC,EAAU,CAAE,OAAO1zC,CAAM,CACpV,SAAS6zC,EAAc35B,GAAU,IAAK,IAAI3e,EAAI,EAAGA,EAAII,UAAUD,OAAQH,IAAK,CAAE,IAAIwd,EAAS,MAAQpd,UAAUJ,GAAKI,UAAUJ,GAAK,CAAC,EAAGA,EAAI,EAAIg4C,EAAQxzC,OAAOgZ,IAAS,GAAIzW,SAAQ,SAAUlF,GAAO02C,EAAgB55B,EAAQ9c,EAAK2b,EAAO3b,GAAO,IAAK2C,OAAOg0C,0BAA4Bh0C,OAAOi0C,iBAAiB95B,EAAQna,OAAOg0C,0BAA0Bh7B,IAAWw6B,EAAQxzC,OAAOgZ,IAASzW,SAAQ,SAAUlF,GAAO2C,OAAOk0C,eAAe/5B,EAAQ9c,EAAK2C,OAAO6zC,yBAAyB76B,EAAQ3b,GAAO,GAAI,CAAE,OAAO8c,CAAQ,CACzf,SAAS45B,EAAgBv5B,EAAKnd,EAAK6B,GAA4L,OAAnL7B,EAC5C,SAAwB9C,GAAO,IAAI8C,EACnC,SAAsB82C,EAAOC,GAAQ,GAAuB,WAAnBf,EAAQc,IAAiC,OAAVA,EAAgB,OAAOA,EAAO,IAAIE,EAAOF,EAAMvwB,OAAO0wB,aAAc,QAAaj6C,IAATg6C,EAAoB,CAAE,IAAIhiC,EAAMgiC,EAAKr4C,KAAKm4C,EAAOC,GAAQ,WAAY,GAAqB,WAAjBf,EAAQhhC,GAAmB,OAAOA,EAAK,MAAM,IAAIpX,UAAU,+CAAiD,CAAE,OAAiB,WAATm5C,EAAoBn7B,OAASs7B,QAAQJ,EAAQ,CADnVK,CAAaj6C,EAAK,UAAW,MAAwB,WAAjB84C,EAAQh2C,GAAoBA,EAAM4b,OAAO5b,EAAM,CAD1Eo3C,CAAep3C,MAAiBmd,EAAOxa,OAAOk0C,eAAe15B,EAAKnd,EAAK,CAAE6B,MAAOA,EAAO0a,YAAY,EAAME,cAAc,EAAMD,UAAU,IAAkBW,EAAInd,GAAO6B,EAAgBsb,CAAK,CAI3O,IAAIq/B,GAAY,OAAoC,CAClD/1C,KAAM,aACNqvC,WAAW,IAYTqhB,EAAmB,SAA0B3vD,EAAO4vD,GACtD,OAAOA,EAAK5vD,EACd,EAgFA,EAxEuB,SAA0B65C,GAC/C,IAAIC,EAAY/iD,UAAUD,OAAS,QAAsBtB,IAAjBuB,UAAU,GAAmBA,UAAU,GAAKu8C,EAAA,EAEpF,OADA,EAAAxF,EAAA,GAAe+L,EAAU7E,KAClB,SAAUmB,GACf,IAGI0Z,EACAC,EAHFC,GADS5Z,GAAgB,CAAC,GACJ6Z,UACtBA,OAA+B,IAAnBD,EAA4BJ,EAAmBI,EAG7D,MAAO,CACL5e,OAAQ,gBACRkG,KAAM,SAAc2C,GAClB,IAAIxG,EAAwBwG,EAAYxG,sBACxCqG,EAAS5K,EAAcA,EAAc,CAAC,EAAG55C,KAAK4kD,qBAAqBD,IAAe,CAAC,EAAG,CACpFxG,sBAAuBA,KACrB,EACN,EACA8D,OAAQ,SAAgB4C,GACtB,IAAI1G,EAAwB0G,EAAc1G,sBAC1CqG,EAAS5K,EAAcA,EAAc,CAAC,EAAG55C,KAAK4kD,qBAAqBC,IAAiB,CAAC,EAAG,CACtF1G,sBAAuBA,KACrB,EACN,EACAtd,QAAS,SAAiB4hB,GACxB,IAAIvxC,EAAQuxC,EAAMvxC,MAElB,OADAuzC,IACOvzC,EAAMxB,kBAAkB,aAASvP,EAC1C,EACA+hD,eAAgB,SAAwB5D,EAAauG,GACnD,OAAOjL,EAAcA,EAAc,CAAC,EAAG0E,GAAc,CAAC,EAAG,CACvDsc,UAAW56D,KAAK4kD,qBAAqBC,IAEzC,EACAD,qBAAsB,SAA8BzB,GAClD,IAAI1lC,EAAS0lC,EAAM1lC,OACjBihC,EAAiByE,EAAMzE,eACvBxtC,EAAQiyC,EAAMjyC,MAWhB,OAVKspD,IACHA,EAAU,SAAiB7vD,GACzBgwD,EAAUhwD,GAAO,SAAU+Q,GACzB,OAAO+B,EAAOhT,SAASiR,GAAGtC,QAC5B,GACF,EACAqhD,EAAS,WACPh9C,EAAOhT,SAAS,IAAI2O,QACtB,GAEK,CACLzO,MAAOuG,EAAMvG,OAAS,GACtBs6C,OAAQuV,EACRK,MAAOJ,EACP3Z,aAAcA,EACdnC,gBAAiBD,EAAeC,gBAEpC,EACAsB,iBAAkB,SAA0B7B,EAASiF,GACnD,IACI14C,EADmB04C,EAAMxB,iBACAl3C,OAAS,GACtC,MAAc,KAAVA,GAAgByzC,GAAWA,EAAQzzC,QAAUA,EACxCyzC,EAEFxE,EAAcA,EAAc,CAAC,EAAGwE,GAAU,CAAC,EAAG,CACnDzzC,MAAOA,GAEX,EACA21C,0BAA2B,SAAmCuB,EAAkB2B,GAC9E,IAAIpF,EAAUoF,EAAMpF,QACpB,OAAOyD,EAAiBnyC,kBAAkB,QAAS0uC,EAAQzzC,OAAS,GACtE,EAEJ,CACF,aCpGO,SAASmwD,EAAax8B,EAAO+mB,GAClC,OAAO,EAAAC,EAAA,GAAa,EAAkBhnB,EAAO+mB,EAC/C,2GCHO,SAAS0V,EAAoB7pD,GAClC,IAAI8pD,EAAcC,EAAaC,EAC/B,OAAO,IAAI,gBAAkChqD,EAAO,CAAC,CACnDvG,MAAwC,QAAhCqwD,EAAe9pD,EAAMvG,aAAoC,IAAjBqwD,EAA0BA,EAAe,GACzFlwD,KAAqC,QAA9BmwD,EAAc/pD,EAAMpG,YAAkC,IAAhBmwD,EAAyBA,EAAc,EACpF/vD,YAA0D,QAA5CgwD,EAAqBhqD,EAAMhG,mBAAgD,IAAvBgwD,EAAgCA,EAAqB,GACvHlgB,KAAM,GACNtgC,OAAQ,EACRygD,QAAS,EACT5zD,OAAQ,GACR6zD,kBAAkB,EAClBtmD,uBAAuB,EACvBZ,iBAAkB,EAClBtQ,MAAOsN,EAAMtN,QACX,CAEFy3D,gBAAgB,GAEpB,CCnBA,SAASliB,EAAQ74B,GAAkC,OAAO64B,EAAU,mBAAqBzvB,QAAU,iBAAmBA,OAAO0vB,SAAW,SAAU94B,GAAO,cAAcA,CAAK,EAAI,SAAUA,GAAO,OAAOA,GAAO,mBAAqBoJ,QAAUpJ,EAAInW,cAAgBuf,QAAUpJ,IAAQoJ,OAAOhpB,UAAY,gBAAkB4f,CAAK,EAAG64B,EAAQ74B,EAAM,CAC/U,SAASg5B,EAAQl4B,EAAQm4B,GAAkB,IAAIxzC,EAAOD,OAAOC,KAAKqb,GAAS,GAAItb,OAAO0zC,sBAAuB,CAAE,IAAIC,EAAU3zC,OAAO0zC,sBAAsBp4B,GAASm4B,IAAmBE,EAAUA,EAAQrzC,QAAO,SAAUszC,GAAO,OAAO5zC,OAAO6zC,yBAAyBv4B,EAAQs4B,GAAKh6B,UAAY,KAAK3Z,EAAKzD,KAAKL,MAAM8D,EAAM0zC,EAAU,CAAE,OAAO1zC,CAAM,CACpV,SAAS6zC,EAAc35B,GAAU,IAAK,IAAI3e,EAAI,EAAGA,EAAII,UAAUD,OAAQH,IAAK,CAAE,IAAIwd,EAAS,MAAQpd,UAAUJ,GAAKI,UAAUJ,GAAK,CAAC,EAAGA,EAAI,EAAIg4C,EAAQxzC,OAAOgZ,IAAS,GAAIzW,SAAQ,SAAUlF,GAAO02C,EAAgB55B,EAAQ9c,EAAK2b,EAAO3b,GAAO,IAAK2C,OAAOg0C,0BAA4Bh0C,OAAOi0C,iBAAiB95B,EAAQna,OAAOg0C,0BAA0Bh7B,IAAWw6B,EAAQxzC,OAAOgZ,IAASzW,SAAQ,SAAUlF,GAAO2C,OAAOk0C,eAAe/5B,EAAQ9c,EAAK2C,OAAO6zC,yBAAyB76B,EAAQ3b,GAAO,GAAI,CAAE,OAAO8c,CAAQ,CACzf,SAAS45B,EAAgBv5B,EAAKnd,EAAK6B,GAA4L,OAAnL7B,EAC5C,SAAwB9C,GAAO,IAAI8C,EACnC,SAAsB82C,EAAOC,GAAQ,GAAuB,WAAnBf,EAAQc,IAAiC,OAAVA,EAAgB,OAAOA,EAAO,IAAIE,EAAOF,EAAMvwB,OAAO0wB,aAAc,QAAaj6C,IAATg6C,EAAoB,CAAE,IAAIhiC,EAAMgiC,EAAKr4C,KAAKm4C,EAAOC,GAAQ,WAAY,GAAqB,WAAjBf,EAAQhhC,GAAmB,OAAOA,EAAK,MAAM,IAAIpX,UAAU,+CAAiD,CAAE,OAAiB,WAATm5C,EAAoBn7B,OAASs7B,QAAQJ,EAAQ,CADnVK,CAAaj6C,EAAK,UAAW,MAAwB,WAAjB84C,EAAQh2C,GAAoBA,EAAM4b,OAAO5b,EAAM,CAD1Eo3C,CAAep3C,MAAiBmd,EAAOxa,OAAOk0C,eAAe15B,EAAKnd,EAAK,CAAE6B,MAAOA,EAAO0a,YAAY,EAAME,cAAc,EAAMD,UAAU,IAAkBW,EAAInd,GAAO6B,EAAgBsb,CAAK,4DCH3O,SAAS,EAAQA,GAAkC,OAAO,EAAU,mBAAqBoJ,QAAU,iBAAmBA,OAAO0vB,SAAW,SAAU94B,GAAO,cAAcA,CAAK,EAAI,SAAUA,GAAO,OAAOA,GAAO,mBAAqBoJ,QAAUpJ,EAAInW,cAAgBuf,QAAUpJ,IAAQoJ,OAAOhpB,UAAY,gBAAkB4f,CAAK,EAAG,EAAQA,EAAM,CAC/U,IAAI87B,EAAY,CAAC,wBAAyB,gBACxCkf,EAAa,CAAC,gBAChB,SAASvV,EAAe/+B,EAAK1lB,GAAK,OAKlC,SAAyB0lB,GAAO,GAAIjlB,MAAMoF,QAAQ6f,GAAM,OAAOA,CAAK,CAL3Bg/B,CAAgBh/B,IAIzD,SAA+BA,EAAK1lB,GAAK,IAAI2kD,EAAK,MAAQj/B,EAAM,KAAO,oBAAsB0C,QAAU1C,EAAI0C,OAAO0vB,WAAapyB,EAAI,cAAe,GAAI,MAAQi/B,EAAI,CAAE,IAAIC,EAAIC,EAAIC,EAAIC,EAAIC,EAAO,GAAIC,GAAK,EAAIl7B,GAAK,EAAI,IAAM,GAAI+6B,GAAMH,EAAKA,EAAGnkD,KAAKklB,IAAMw/B,KAAM,IAAMllD,EAAG,CAAE,GAAIwE,OAAOmgD,KAAQA,EAAI,OAAQM,GAAK,CAAI,MAAO,OAASA,GAAML,EAAKE,EAAGtkD,KAAKmkD,IAAKQ,QAAUH,EAAKhkD,KAAK4jD,EAAGlhD,OAAQshD,EAAK7kD,SAAWH,GAAIilD,GAAK,GAAK,CAAE,MAAO3kD,GAAOypB,GAAK,EAAI86B,EAAKvkD,CAAK,CAAE,QAAU,IAAM,IAAK2kD,GAAM,MAAQN,EAAGS,SAAWL,EAAKJ,EAAGS,SAAU5gD,OAAOugD,KAAQA,GAAK,MAAQ,CAAE,QAAU,GAAIh7B,EAAI,MAAM86B,CAAI,CAAE,CAAE,OAAOG,CAAM,CAAE,CAJ1gBK,CAAsB3/B,EAAK1lB,IAE5F,SAAqCwnB,EAAG02B,GAAU,IAAK12B,EAAG,OAAQ,GAAiB,kBAANA,EAAgB,OAAOs2B,EAAkBt2B,EAAG02B,GAAS,IAAI3+C,EAAIiF,OAAOpF,UAAUqQ,SAASjP,KAAKgnB,GAAG9mB,MAAM,GAAI,GAAc,WAANnB,GAAkBioB,EAAE3e,cAAatJ,EAAIioB,EAAE3e,YAAYP,MAAM,GAAU,QAAN/I,GAAqB,QAANA,EAAa,OAAOkB,MAAM8wB,KAAK/J,GAAI,GAAU,cAANjoB,GAAqB,2CAA2CyiB,KAAKziB,GAAI,OAAOu+C,EAAkBt2B,EAAG02B,EAAS,CAF7TC,CAA4Bz4B,EAAK1lB,IACnI,WAA8B,MAAM,IAAIP,UAAU,4IAA8I,CADvD6lD,EAAoB,CAG7J,SAASxH,EAAkBp4B,EAAK5lB,IAAkB,MAAPA,GAAeA,EAAM4lB,EAAIvlB,UAAQL,EAAM4lB,EAAIvlB,QAAQ,IAAK,IAAIH,EAAI,EAAGwe,EAAO,IAAI/d,MAAMX,GAAME,EAAIF,EAAKE,IAAKwe,EAAKxe,GAAK0lB,EAAI1lB,GAAI,OAAOwe,CAAM,CAGlL,SAAS,EAAQsB,EAAQm4B,GAAkB,IAAIxzC,EAAOD,OAAOC,KAAKqb,GAAS,GAAItb,OAAO0zC,sBAAuB,CAAE,IAAIC,EAAU3zC,OAAO0zC,sBAAsBp4B,GAASm4B,IAAmBE,EAAUA,EAAQrzC,QAAO,SAAUszC,GAAO,OAAO5zC,OAAO6zC,yBAAyBv4B,EAAQs4B,GAAKh6B,UAAY,KAAK3Z,EAAKzD,KAAKL,MAAM8D,EAAM0zC,EAAU,CAAE,OAAO1zC,CAAM,CACpV,SAAS,EAAcka,GAAU,IAAK,IAAI3e,EAAI,EAAGA,EAAII,UAAUD,OAAQH,IAAK,CAAE,IAAIwd,EAAS,MAAQpd,UAAUJ,GAAKI,UAAUJ,GAAK,CAAC,EAAGA,EAAI,EAAI,EAAQwE,OAAOgZ,IAAS,GAAIzW,SAAQ,SAAUlF,GAAO,EAAgB8c,EAAQ9c,EAAK2b,EAAO3b,GAAO,IAAK2C,OAAOg0C,0BAA4Bh0C,OAAOi0C,iBAAiB95B,EAAQna,OAAOg0C,0BAA0Bh7B,IAAW,EAAQhZ,OAAOgZ,IAASzW,SAAQ,SAAUlF,GAAO2C,OAAOk0C,eAAe/5B,EAAQ9c,EAAK2C,OAAO6zC,yBAAyB76B,EAAQ3b,GAAO,GAAI,CAAE,OAAO8c,CAAQ,CACzf,SAAS,EAAgBK,EAAKnd,EAAK6B,GAA4L,OAAnL7B,EAC5C,SAAwB9C,GAAO,IAAI8C,EACnC,SAAsB82C,EAAOC,GAAQ,GAAuB,WAAnB,EAAQD,IAAiC,OAAVA,EAAgB,OAAOA,EAAO,IAAIE,EAAOF,EAAMvwB,OAAO0wB,aAAc,QAAaj6C,IAATg6C,EAAoB,CAAE,IAAIhiC,EAAMgiC,EAAKr4C,KAAKm4C,EAAOC,GAAQ,WAAY,GAAqB,WAAjB,EAAQ/hC,GAAmB,OAAOA,EAAK,MAAM,IAAIpX,UAAU,+CAAiD,CAAE,OAAiB,WAATm5C,EAAoBn7B,OAASs7B,QAAQJ,EAAQ,CADnV,CAAa55C,EAAK,UAAW,MAAwB,WAAjB,EAAQ8C,GAAoBA,EAAM4b,OAAO5b,EAAM,CAD1E,CAAeA,MAAiBmd,EAAOxa,OAAOk0C,eAAe15B,EAAKnd,EAAK,CAAE6B,MAAOA,EAAO0a,YAAY,EAAME,cAAc,EAAMD,UAAU,IAAkBW,EAAInd,GAAO6B,EAAgBsb,CAAK,CAG3O,SAAS+7B,EAAyBv9B,EAAQyB,GAAY,GAAc,MAAVzB,EAAgB,MAAO,CAAC,EAAG,IAAkE3b,EAAK7B,EAAnE2e,EACzF,SAAuCnB,EAAQyB,GAAY,GAAc,MAAVzB,EAAgB,MAAO,CAAC,EAAG,IAA2D3b,EAAK7B,EAA5D2e,EAAS,CAAC,EAAOO,EAAa1a,OAAOC,KAAK+Y,GAAqB,IAAKxd,EAAI,EAAGA,EAAIkf,EAAW/e,OAAQH,IAAO6B,EAAMqd,EAAWlf,GAAQif,EAAS9Z,QAAQtD,IAAQ,IAAa8c,EAAO9c,GAAO2b,EAAO3b,IAAQ,OAAO8c,CAAQ,CADhNq8B,CAA8Bx9B,EAAQyB,GAAuB,GAAIza,OAAO0zC,sBAAuB,CAAE,IAAI+C,EAAmBz2C,OAAO0zC,sBAAsB16B,GAAS,IAAKxd,EAAI,EAAGA,EAAIi7C,EAAiB96C,OAAQH,IAAO6B,EAAMo5C,EAAiBj7C,GAAQif,EAAS9Z,QAAQtD,IAAQ,GAAkB2C,OAAOpF,UAAU87C,qBAAqB16C,KAAKgd,EAAQ3b,KAAgB8c,EAAO9c,GAAO2b,EAAO3b,GAAQ,CAAE,OAAO8c,CAAQ,CAUpe,SAASqlC,EAAarM,GAC3B,IAAI3a,EAAQ58B,UAAUD,OAAS,QAAsBtB,IAAjBuB,UAAU,GAAmBA,UAAU,GAAK,CAAC,EAC7E2jD,EAA6B3jD,UAAUD,OAAS,QAAsBtB,IAAjBuB,UAAU,GAAmBA,UAAU,GAAK,CAAC,EAClGq1D,GAAgB,EAAAC,EAAA,KAChB59C,GAAS,EAAAmiD,EAAA,KACTC,GAAc,EAAAC,EAAA,KACdC,GAAc,EAAAC,EAAA,GAAer9B,GAC7Bs9B,GAAmC,EAAAD,EAAA,GAAetW,GAClDwW,GAAoB,IAAAtE,SAAO,GAC3BuE,GAAyB,IAAAvE,QAAO,MAChCwE,GAAoB,IAAAxE,QAAOn+C,EAAOwlC,QAClC7F,GAAS,IAAAijB,UAAQ,WA4CnB,OAAO,EAAc,EAAc,CAAC,EA3CjB/iB,GAAU,SAAUyL,EAAgBuX,GAKrD,GAAIA,EACFJ,EAAkB3lC,SAAU,OAc9B,GAAI2lC,EAAkB3lC,QAAS,CAC7B,IAAIioB,EAAwBuG,EAAevG,sBAEzCG,GADeoG,EAAe5D,aAChBzE,EAAyBqI,EAAgBtI,KAMpD,EAAA8f,EAAA,GAAO5d,EAAawd,EAAuB5lC,SAAS,SAAUjvB,EAAGC,GACpE,OAAc,OAAND,QAAoB,IAANA,OAAe,EAASA,EAAEkD,eAAiBgyD,WAAmB,OAANj1D,QAAoB,IAANA,OAAe,EAASA,EAAEiD,eAAiBgyD,QACzI,KAAMhe,EAAsBS,SAAWmd,EAAkB7lC,UAEvDvZ,EAAS2hC,GACTwd,EAAuB5lC,QAAUooB,EACjCyd,EAAkB7lC,QAAUioB,EAAsBS,OAEtD,CACF,IAAG,WAGDid,EAAkB3lC,SAAU,CAC9B,GACuCkmC,CAAaV,IAAeE,EACrE,GAAG,CAAC3iB,EAAWyiB,EAAaE,IAuC1BS,EAAatW,GAtCC,IAAA77B,WAAS,WACrB,GAAI6uB,EAAO6L,qBAAsB,CAC/B,IAAI0X,EAEA7+C,EAAS+9C,EAAYnd,YACrBD,EAAUod,EAAYvb,iBAAiB,CAAC,GAAGub,EAAY3a,cAC3DpjC,EAAOvM,OAAwE,QAA9DorD,EAAwBvjB,EAAOuH,iCAAiE,IAA1Bgc,OAAmC,EAASA,EAAsBx6D,KAAKi3C,EAAQt7B,EAAOvM,MAAO,CAClLktC,QAASA,MACJ3gC,EAAOvM,MACd,IAAIqrD,EDnFL,SAA+B7M,GACpC,IAAIjyC,EAASiyC,EAAYrR,YACrBnrC,EAEJw8C,EAAY5Q,cAEZic,EAAoBt9C,EAAOvM,OACvButC,EAAgBiR,EAAY3Q,mBAAmB/1C,KAAI,SAAUwzD,GAC/D,IAAIC,EAAkBD,EAAa5b,UAAY8O,EAAY7O,aAAe3tC,EAAU6nD,EAAoByB,EAAa/+C,OAAOvM,OAC5H,OAAO0oC,EAAcA,EAAc,CAAC,EAAG4iB,GAAe,CAAC,EAAG,CAExDtpD,QAASspD,EAAatpD,SAAWupD,GAErC,IACA,MAAO,CACLvpD,QAASA,EACTurC,cAAeA,EAEnB,CCiEoCie,CAAsBlB,GAChDtoD,EAAUqpD,EAAsBrpD,QAChCurC,EAAgB8d,EAAsB9d,cAKpCke,EAAwB5jB,EAAO6L,qBAAqB,CACpDnnC,OAAQA,EACRzL,OAAQwpD,EACRrd,sBAAuB/kC,EACvBlG,QAASA,EACTurC,cAAeA,EACfvtC,MAAOuM,EAAOvM,MACdotC,YAAallC,EAAOklC,YACpBC,gBAAiBnlC,EAAOmlC,gBACxBC,UAAWgd,EAAYhd,UACvBE,eAAgB,CACdC,gBAAmC,YAAlBvlC,EAAOwlC,QAE1BA,OAAQxlC,EAAOwlC,OACfp9C,MAAO4X,EAAO5X,QAEDm7D,EAAsB7b,aAEvC,OADgBzE,EAAyBsgB,EAAuBrB,EAElE,CACA,MAAO,CAAC,CACV,IACuC,GACvCpqD,EAAQmrD,EAAW,GACnB1/C,EAAW0/C,EAAW,GAOxB,OANA,EAAAO,EAAA,GAAU,CACR7jB,OAAQA,EACRyiB,YAAaA,EACbl9B,MAAOo9B,EACPmB,UAAWt2D,QAAQwwD,KAEd7lD,CACT,0EChIWqnD,GAA4B,WAAAuE,eAAc,8ECA1CxE,GAAoC,WAAAwE,eAAc,0CCD7D,SAAS3jB,EAAQ74B,GAAkC,OAAO64B,EAAU,mBAAqBzvB,QAAU,iBAAmBA,OAAO0vB,SAAW,SAAU94B,GAAO,cAAcA,CAAK,EAAI,SAAUA,GAAO,OAAOA,GAAO,mBAAqBoJ,QAAUpJ,EAAInW,cAAgBuf,QAAUpJ,IAAQoJ,OAAOhpB,UAAY,gBAAkB4f,CAAK,EAAG64B,EAAQ74B,EAAM,iCAa/U,IAAIyD,EAAMje,OAAOpF,UAAUwf,eACpB,SAASg8C,EAAOa,EAAKC,EAAK7/B,GAE/B,GAAgB,OAAZA,QAAgC,IAAZA,GAAsBA,EAAQ4/B,EAAKC,GACzD,OAAO,EAIT,IAAIz9C,EACAne,EACJ,GAAI27D,IAAQC,EAAK,OAAO,EACxB,GAAID,GAAOC,IAAQz9C,EAAOw9C,EAAI5yD,eAAiB6yD,EAAI7yD,YAAa,CAC9D,GAAIoV,IAAS4H,KAAM,OAAO41C,EAAIE,YAAcD,EAAIC,UAChD,GAAI19C,IAASs7B,OAAQ,OAAOkiB,EAAIhsD,aAAeisD,EAAIjsD,WACnD,GAAIwO,IAASxd,MAAO,CAClB,IAAKX,EAAM27D,EAAIt7D,UAAYu7D,EAAIv7D,OAC7B,KAAOL,KAAS86D,EAAOa,EAAI37D,GAAM47D,EAAI57D,GAAM+7B,KAE7C,OAAgB,IAAT/7B,CACT,CACA,IAAKme,GAAyB,WAAjB45B,EAAQ4jB,GAAmB,CAGtC,IAAKx9C,KAFLne,EAAM,EAEO27D,EAAK,CAChB,GAAIh5C,EAAIjiB,KAAKi7D,EAAKx9C,MAAWne,IAAQ2iB,EAAIjiB,KAAKk7D,EAAKz9C,GAAO,OAAO,EACjE,KAAMA,KAAQy9C,KAASd,EAAOa,EAAIx9C,GAAOy9C,EAAIz9C,GAAO4d,GAAU,OAAO,CACvE,CACA,OAAOr3B,OAAOC,KAAKi3D,GAAKv7D,SAAWL,CACrC,CACF,CAGA,OAAO27D,IAAQA,GAAOC,IAAQA,CAChC,sCCtCO,SAASE,EAAUC,EAAWjkB,GACnC,IAAIikB,EAIF,MAAM,IAAIx7D,MAAM,mBAKpB,oHClBA,SAASokD,EAAe/+B,EAAK1lB,GAAK,OAKlC,SAAyB0lB,GAAO,GAAIjlB,MAAMoF,QAAQ6f,GAAM,OAAOA,CAAK,CAL3Bg/B,CAAgBh/B,IAIzD,SAA+BA,EAAK1lB,GAAK,IAAI2kD,EAAK,MAAQj/B,EAAM,KAAO,oBAAsB0C,QAAU1C,EAAI0C,OAAO0vB,WAAapyB,EAAI,cAAe,GAAI,MAAQi/B,EAAI,CAAE,IAAIC,EAAIC,EAAIC,EAAIC,EAAIC,EAAO,GAAIC,GAAK,EAAIl7B,GAAK,EAAI,IAAM,GAAI+6B,GAAMH,EAAKA,EAAGnkD,KAAKklB,IAAMw/B,KAAM,IAAMllD,EAAG,CAAE,GAAIwE,OAAOmgD,KAAQA,EAAI,OAAQM,GAAK,CAAI,MAAO,OAASA,GAAML,EAAKE,EAAGtkD,KAAKmkD,IAAKQ,QAAUH,EAAKhkD,KAAK4jD,EAAGlhD,OAAQshD,EAAK7kD,SAAWH,GAAIilD,GAAK,GAAK,CAAE,MAAO3kD,GAAOypB,GAAK,EAAI86B,EAAKvkD,CAAK,CAAE,QAAU,IAAM,IAAK2kD,GAAM,MAAQN,EAAGS,SAAWL,EAAKJ,EAAGS,SAAU5gD,OAAOugD,KAAQA,GAAK,MAAQ,CAAE,QAAU,GAAIh7B,EAAI,MAAM86B,CAAI,CAAE,CAAE,OAAOG,CAAM,CAAE,CAJ1gBK,CAAsB3/B,EAAK1lB,IAE5F,SAAqCwnB,EAAG02B,GAAU,IAAK12B,EAAG,OAAQ,GAAiB,kBAANA,EAAgB,OAAOs2B,EAAkBt2B,EAAG02B,GAAS,IAAI3+C,EAAIiF,OAAOpF,UAAUqQ,SAASjP,KAAKgnB,GAAG9mB,MAAM,GAAI,GAAc,WAANnB,GAAkBioB,EAAE3e,cAAatJ,EAAIioB,EAAE3e,YAAYP,MAAM,GAAU,QAAN/I,GAAqB,QAANA,EAAa,OAAOkB,MAAM8wB,KAAK/J,GAAI,GAAU,cAANjoB,GAAqB,2CAA2CyiB,KAAKziB,GAAI,OAAOu+C,EAAkBt2B,EAAG02B,EAAS,CAF7TC,CAA4Bz4B,EAAK1lB,IACnI,WAA8B,MAAM,IAAIP,UAAU,4IAA8I,CADvD6lD,EAAoB,CAG7J,SAASxH,EAAkBp4B,EAAK5lB,IAAkB,MAAPA,GAAeA,EAAM4lB,EAAIvlB,UAAQL,EAAM4lB,EAAIvlB,QAAQ,IAAK,IAAIH,EAAI,EAAGwe,EAAO,IAAI/d,MAAMX,GAAME,EAAIF,EAAKE,IAAKwe,EAAKxe,GAAK0lB,EAAI1lB,GAAI,OAAOwe,CAAM,CAS3K,SAASg3C,IAMd,OAFiB/Q,GAHC,IAAAqX,aAAW,SAAUtkC,GACnC,OAAOA,EAAI,CACb,GAAG,GACwC,GAChB,EAE/B,2GChBO,SAAS2iC,IACd,IAAI55D,GAAU,IAAAw7D,YAAW,KAEzB,OADA,OAAsB,OAAZx7D,EAAkB,8DACrBA,CACT,2GCJO,SAAS05D,IACd,IAAIniD,GAAS,IAAAikD,YAAW,KAExB,OADA,OAAqB,OAAXjkD,EAAiB,8PACpBA,CACT,qFCNWkkD,GAAuC,IAAAR,eAAc,MCCzD,SAAS5F,IACd,OAAO,IAAAmG,YAAWC,EACpB,qFCHWC,GAA0C,IAAAT,eAAc,MCC5D,SAAS9F,IACd,OAAO,IAAAqG,YAAWE,EACpB,qFCGW7nC,EAA8C,qBAAXhL,OAAyB,EAAAN,gBAAkB,EAAAD,6FCN9EqzC,GAAuC,IAAAV,eAAc,MCCzD,SAAS1F,IACd,OAAO,IAAAiG,YAAWG,EACpB,gGCJA,SAASzX,EAAe/+B,EAAK1lB,GAAK,OAKlC,SAAyB0lB,GAAO,GAAIjlB,MAAMoF,QAAQ6f,GAAM,OAAOA,CAAK,CAL3Bg/B,CAAgBh/B,IAIzD,SAA+BA,EAAK1lB,GAAK,IAAI2kD,EAAK,MAAQj/B,EAAM,KAAO,oBAAsB0C,QAAU1C,EAAI0C,OAAO0vB,WAAapyB,EAAI,cAAe,GAAI,MAAQi/B,EAAI,CAAE,IAAIC,EAAIC,EAAIC,EAAIC,EAAIC,EAAO,GAAIC,GAAK,EAAIl7B,GAAK,EAAI,IAAM,GAAI+6B,GAAMH,EAAKA,EAAGnkD,KAAKklB,IAAMw/B,KAAM,IAAMllD,EAAG,CAAE,GAAIwE,OAAOmgD,KAAQA,EAAI,OAAQM,GAAK,CAAI,MAAO,OAASA,GAAML,EAAKE,EAAGtkD,KAAKmkD,IAAKQ,QAAUH,EAAKhkD,KAAK4jD,EAAGlhD,OAAQshD,EAAK7kD,SAAWH,GAAIilD,GAAK,GAAK,CAAE,MAAO3kD,GAAOypB,GAAK,EAAI86B,EAAKvkD,CAAK,CAAE,QAAU,IAAM,IAAK2kD,GAAM,MAAQN,EAAGS,SAAWL,EAAKJ,EAAGS,SAAU5gD,OAAOugD,KAAQA,GAAK,MAAQ,CAAE,QAAU,GAAIh7B,EAAI,MAAM86B,CAAI,CAAE,CAAE,OAAOG,CAAM,CAAE,CAJ1gBK,CAAsB3/B,EAAK1lB,IAE5F,SAAqCwnB,EAAG02B,GAAU,IAAK12B,EAAG,OAAQ,GAAiB,kBAANA,EAAgB,OAAOs2B,EAAkBt2B,EAAG02B,GAAS,IAAI3+C,EAAIiF,OAAOpF,UAAUqQ,SAASjP,KAAKgnB,GAAG9mB,MAAM,GAAI,GAAc,WAANnB,GAAkBioB,EAAE3e,cAAatJ,EAAIioB,EAAE3e,YAAYP,MAAM,GAAU,QAAN/I,GAAqB,QAANA,EAAa,OAAOkB,MAAM8wB,KAAK/J,GAAI,GAAU,cAANjoB,GAAqB,2CAA2CyiB,KAAKziB,GAAI,OAAOu+C,EAAkBt2B,EAAG02B,EAAS,CAF7TC,CAA4Bz4B,EAAK1lB,IACnI,WAA8B,MAAM,IAAIP,UAAU,4IAA8I,CADvD6lD,EAAoB,CAG7J,SAASxH,EAAkBp4B,EAAK5lB,IAAkB,MAAPA,GAAeA,EAAM4lB,EAAIvlB,UAAQL,EAAM4lB,EAAIvlB,QAAQ,IAAK,IAAIH,EAAI,EAAGwe,EAAO,IAAI/d,MAAMX,GAAME,EAAIF,EAAKE,IAAKwe,EAAKxe,GAAK0lB,EAAI1lB,GAAI,OAAOwe,CAAM,CAK3K,SAAS67C,EAAe32D,GAC7B,IAGEq3D,EAAatW,GAHC,IAAA77B,WAAS,WACrB,OAAOllB,CACT,IACuC,GACvCy4D,EAAcpB,EAAW,GACzBqB,EAAiBrB,EAAW,GAI9B,OAHK,OAAOoB,EAAaz4D,IACvB04D,EAAe14D,GAEVy4D,CACT,2GCfW9K,EAAM,EAAY,qCCEtB,SAASiK,EAAU12B,GACxB,IAAIy3B,EACA5kB,EAAS7S,EAAK6S,OAChByiB,EAAct1B,EAAKs1B,YACnBl9B,EAAQ4H,EAAK5H,MACbu+B,EAAY32B,EAAK22B,UACf1F,GAAuB,EAAAC,EAAA,KACvBE,GAAe,IAAAC,QAAOj5B,IAC1B,IAAAnU,YAAU,WACRmtC,EAAaphC,QAAUoI,CACzB,GAAG,CAACA,IACJ,IAAIs/B,GAAgB,IAAArG,QAAOxe,IAC3B,IAAA5uB,YAAU,WACRyzC,EAAc1nC,QAAU6iB,CAC1B,GAAG,CAACA,IACJ,IAyDM8kB,EAzDF5F,GAAkB,IAAAV,QAAO,MACzBuG,EAAuBjB,IAAcrB,EAAY9a,aAAatT,SAAS2L,GACvE3/B,GAAS,EAAAmiD,EAAA,OAMb,EAAA7lC,EAAA,IAA0B,WACxB,IAAIqoC,EAAiBH,EAAc1nC,QAG9B+hC,EAAgB/hC,SASnBvJ,aAAasrC,EAAgB/hC,UAQT,EAAAgmC,EAAA,GAAO59B,EAAOg5B,EAAaphC,WAO7CslC,EAAYlZ,cAAc,CAACyb,IAC3BvC,EAAY1Z,WAAW,CAAC/I,MAxBrB+kB,GACHtC,EAAY1Z,WAAW,CAAC/I,IA0B5B,OAAO,WAGLkf,EAAgB/hC,QAAUtJ,YAAW,WACnCxT,EAAOu+C,WAAU,WACXv+C,EAAOg/C,uBACXoD,EAAYlZ,cAAc,CAACyb,GAC7B,GACF,GACF,CACF,GAAG,CAACvC,EAAaziB,EAAQ+kB,EAAsB1kD,EAAQklB,KACnDw/B,GAAsP,aAApM,OAAzB3G,QAA0D,IAAzBA,GAAsG,QAA1DwG,EAAwBxG,EAAqBjhC,eAA+C,IAA1BynC,OAA5E,EAAwHA,EAAsB/e,UAC5O4c,EAAY1Z,WAAW,CAAC/I,IAEJ,qBAAXruB,QAAmD,OAAzBysC,QAA0D,IAAzBA,GAAmCA,EAAqBjhC,SAE5G,cAAlB6iB,EAAO+C,UAEL6W,EAAIwE,EAAqBjhC,SAGH,uBAAlB6iB,EAAO+C,QAAwE,QAApC+hB,EAAiBzkD,EAAOqE,cAAuC,IAAnBogD,GAA6BA,EAAe15D,aACrIwuD,EAAIwE,EAAqBjhC,SAG/B","sources":["webpack://daocloud/./node_modules/@algolia/events/events.js","webpack://daocloud/./node_modules/instantsearch.js/node_modules/algoliasearch-helper/index.js","webpack://daocloud/./node_modules/instantsearch.js/node_modules/algoliasearch-helper/src/DerivedHelper/index.js","webpack://daocloud/./node_modules/instantsearch.js/node_modules/algoliasearch-helper/src/SearchParameters/RefinementList.js","webpack://daocloud/./node_modules/instantsearch.js/node_modules/algoliasearch-helper/src/SearchParameters/index.js","webpack://daocloud/./node_modules/instantsearch.js/node_modules/algoliasearch-helper/src/SearchResults/generate-hierarchical-tree.js","webpack://daocloud/./node_modules/instantsearch.js/node_modules/algoliasearch-helper/src/SearchResults/index.js","webpack://daocloud/./node_modules/instantsearch.js/node_modules/algoliasearch-helper/src/algoliasearch.helper.js","webpack://daocloud/./node_modules/instantsearch.js/node_modules/algoliasearch-helper/src/functions/compact.js","webpack://daocloud/./node_modules/instantsearch.js/node_modules/algoliasearch-helper/src/functions/defaultsPure.js","webpack://daocloud/./node_modules/instantsearch.js/node_modules/algoliasearch-helper/src/functions/escapeFacetValue.js","webpack://daocloud/./node_modules/instantsearch.js/node_modules/algoliasearch-helper/src/functions/find.js","webpack://daocloud/./node_modules/instantsearch.js/node_modules/algoliasearch-helper/src/functions/findIndex.js","webpack://daocloud/./node_modules/instantsearch.js/node_modules/algoliasearch-helper/src/functions/formatSort.js","webpack://daocloud/./node_modules/instantsearch.js/node_modules/algoliasearch-helper/src/functions/inherits.js","webpack://daocloud/./node_modules/instantsearch.js/node_modules/algoliasearch-helper/src/functions/intersection.js","webpack://daocloud/./node_modules/instantsearch.js/node_modules/algoliasearch-helper/src/functions/merge.js","webpack://daocloud/./node_modules/instantsearch.js/node_modules/algoliasearch-helper/src/functions/objectHasKeys.js","webpack://daocloud/./node_modules/instantsearch.js/node_modules/algoliasearch-helper/src/functions/omit.js","webpack://daocloud/./node_modules/instantsearch.js/node_modules/algoliasearch-helper/src/functions/orderBy.js","webpack://daocloud/./node_modules/instantsearch.js/node_modules/algoliasearch-helper/src/functions/valToNumber.js","webpack://daocloud/./node_modules/instantsearch.js/node_modules/algoliasearch-helper/src/requestBuilder.js","webpack://daocloud/./node_modules/instantsearch.js/node_modules/algoliasearch-helper/src/utils/isValidUserToken.js","webpack://daocloud/./node_modules/instantsearch.js/node_modules/algoliasearch-helper/src/version.js","webpack://daocloud/./node_modules/instantsearch.js/node_modules/qs/lib/formats.js","webpack://daocloud/./node_modules/instantsearch.js/node_modules/qs/lib/index.js","webpack://daocloud/./node_modules/instantsearch.js/node_modules/qs/lib/parse.js","webpack://daocloud/./node_modules/instantsearch.js/node_modules/qs/lib/stringify.js","webpack://daocloud/./node_modules/instantsearch.js/node_modules/qs/lib/utils.js","webpack://daocloud/./node_modules/react-instantsearch/node_modules/algoliasearch-helper/index.js","webpack://daocloud/./node_modules/react-instantsearch/node_modules/algoliasearch-helper/src/DerivedHelper/index.js","webpack://daocloud/./node_modules/react-instantsearch/node_modules/algoliasearch-helper/src/SearchParameters/RefinementList.js","webpack://daocloud/./node_modules/react-instantsearch/node_modules/algoliasearch-helper/src/SearchParameters/index.js","webpack://daocloud/./node_modules/react-instantsearch/node_modules/algoliasearch-helper/src/SearchResults/generate-hierarchical-tree.js","webpack://daocloud/./node_modules/react-instantsearch/node_modules/algoliasearch-helper/src/SearchResults/index.js","webpack://daocloud/./node_modules/react-instantsearch/node_modules/algoliasearch-helper/src/algoliasearch.helper.js","webpack://daocloud/./node_modules/react-instantsearch/node_modules/algoliasearch-helper/src/functions/compact.js","webpack://daocloud/./node_modules/react-instantsearch/node_modules/algoliasearch-helper/src/functions/defaultsPure.js","webpack://daocloud/./node_modules/react-instantsearch/node_modules/algoliasearch-helper/src/functions/escapeFacetValue.js","webpack://daocloud/./node_modules/react-instantsearch/node_modules/algoliasearch-helper/src/functions/find.js","webpack://daocloud/./node_modules/react-instantsearch/node_modules/algoliasearch-helper/src/functions/findIndex.js","webpack://daocloud/./node_modules/react-instantsearch/node_modules/algoliasearch-helper/src/functions/formatSort.js","webpack://daocloud/./node_modules/react-instantsearch/node_modules/algoliasearch-helper/src/functions/inherits.js","webpack://daocloud/./node_modules/react-instantsearch/node_modules/algoliasearch-helper/src/functions/intersection.js","webpack://daocloud/./node_modules/react-instantsearch/node_modules/algoliasearch-helper/src/functions/merge.js","webpack://daocloud/./node_modules/react-instantsearch/node_modules/algoliasearch-helper/src/functions/objectHasKeys.js","webpack://daocloud/./node_modules/react-instantsearch/node_modules/algoliasearch-helper/src/functions/omit.js","webpack://daocloud/./node_modules/react-instantsearch/node_modules/algoliasearch-helper/src/functions/orderBy.js","webpack://daocloud/./node_modules/react-instantsearch/node_modules/algoliasearch-helper/src/functions/valToNumber.js","webpack://daocloud/./node_modules/react-instantsearch/node_modules/algoliasearch-helper/src/requestBuilder.js","webpack://daocloud/./node_modules/react-instantsearch/node_modules/algoliasearch-helper/src/utils/isValidUserToken.js","webpack://daocloud/./node_modules/react-instantsearch/node_modules/algoliasearch-helper/src/version.js","webpack://daocloud/./node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.min.js","webpack://daocloud/./node_modules/use-sync-external-store/shim/index.js","webpack://daocloud/./node_modules/@tanstack/virtual-core/dist/esm/utils.js","webpack://daocloud/./node_modules/@tanstack/virtual-core/dist/esm/index.js","webpack://daocloud/./node_modules/@tanstack/react-virtual/dist/esm/index.js","webpack://daocloud/./node_modules/@headlessui/react/dist/hooks/use-refocusable-input.js","webpack://daocloud/./node_modules/@headlessui/react/dist/components/mouse.js","webpack://daocloud/./node_modules/@headlessui/react/dist/components/combobox/combobox.js","webpack://daocloud/./node_modules/@headlessui/react/dist/hooks/use-frame-debounce.js","webpack://daocloud/./node_modules/@headlessui/react/dist/components/label/label.js","webpack://daocloud/./node_modules/@headlessui/react/dist/hooks/use-active-press.js","webpack://daocloud/./node_modules/@headlessui/react/dist/hooks/use-by-comparator.js","webpack://daocloud/./node_modules/@headlessui/react/dist/hooks/use-controllable.js","webpack://daocloud/./node_modules/@headlessui/react/dist/hooks/use-default-value.js","webpack://daocloud/./node_modules/@headlessui/react/dist/hooks/use-element-size.js","webpack://daocloud/./node_modules/@headlessui/react/dist/hooks/use-resolve-button-type.js","webpack://daocloud/./node_modules/@headlessui/react/dist/hooks/use-tracked-pointer.js","webpack://daocloud/./node_modules/@headlessui/react/dist/hooks/use-tree-walker.js","webpack://daocloud/./node_modules/@floating-ui/react/dist/floating-ui.react.utils.mjs","webpack://daocloud/./node_modules/@floating-ui/react-dom/dist/floating-ui.react-dom.mjs","webpack://daocloud/./node_modules/@floating-ui/react/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.mjs","webpack://daocloud/./node_modules/@floating-ui/react/dist/floating-ui.react.mjs","webpack://daocloud/./node_modules/@headlessui/react/dist/internal/floating.js","webpack://daocloud/./node_modules/@headlessui/react/dist/internal/id.js","webpack://daocloud/./node_modules/@headlessui/react/dist/utils/bugs.js","webpack://daocloud/./node_modules/@headlessui/react/dist/utils/calculate-active-index.js","webpack://daocloud/./node_modules/@react-aria/utils/dist/platform.mjs","webpack://daocloud/./node_modules/@react-aria/utils/dist/isVirtualEvent.mjs","webpack://daocloud/./node_modules/@react-aria/utils/dist/domHelpers.mjs","webpack://daocloud/./node_modules/@react-aria/interactions/dist/useFocusVisible.mjs","webpack://daocloud/./node_modules/@react-aria/utils/dist/useLayoutEffect.mjs","webpack://daocloud/./node_modules/@react-aria/utils/dist/useEffectEvent.mjs","webpack://daocloud/./node_modules/@react-aria/interactions/dist/utils.mjs","webpack://daocloud/./node_modules/@react-aria/interactions/dist/useFocus.mjs","webpack://daocloud/./node_modules/@react-aria/interactions/dist/useFocusWithin.mjs","webpack://daocloud/./node_modules/@react-aria/focus/dist/useFocusRing.mjs","webpack://daocloud/./node_modules/@react-aria/interactions/dist/useHover.mjs","webpack://daocloud/./node_modules/instantsearch.js/es/lib/utils/checkRendering.js","webpack://daocloud/./node_modules/instantsearch.js/es/lib/utils/getObjectType.js","webpack://daocloud/./node_modules/instantsearch.js/es/lib/utils/documentation.js","webpack://daocloud/./node_modules/instantsearch.js/es/lib/utils/escape-highlight.js","webpack://daocloud/./node_modules/instantsearch.js/es/lib/utils/escape-html.js","webpack://daocloud/./node_modules/instantsearch.js/es/lib/utils/isIndexWidget.js","webpack://daocloud/./node_modules/instantsearch.js/es/lib/utils/isPlainObject.js","webpack://daocloud/./node_modules/instantsearch.js/es/lib/utils/mergeSearchParameters.js","webpack://daocloud/./node_modules/instantsearch.js/es/lib/utils/findIndex.js","webpack://daocloud/./node_modules/instantsearch.js/es/lib/utils/uniq.js","webpack://daocloud/./node_modules/instantsearch.js/es/lib/utils/noop.js","webpack://daocloud/./node_modules/instantsearch.js/es/lib/utils/render-args.js","webpack://daocloud/./node_modules/instantsearch.js/es/lib/utils/serializer.js","webpack://daocloud/./node_modules/instantsearch.js/es/widgets/index/index.js","webpack://daocloud/./node_modules/instantsearch.js/es/lib/utils/resolveSearchParameters.js","webpack://daocloud/./node_modules/instantsearch.js/es/connectors/configure/connectConfigure.js","webpack://daocloud/./node_modules/react-instantsearch/node_modules/react-instantsearch-core/dist/es/components/Configure.js","webpack://daocloud/./node_modules/react-instantsearch/node_modules/react-instantsearch-core/dist/es/connectors/useConfigure.js","webpack://daocloud/./node_modules/instantsearch.js/es/helpers/get-insights-anonymous-user-token.js","webpack://daocloud/./node_modules/instantsearch.js/es/lib/utils/safelyRunOnBrowser.js","webpack://daocloud/./node_modules/instantsearch.js/es/middlewares/createInsightsMiddleware.js","webpack://daocloud/./node_modules/instantsearch.js/es/middlewares/createMetadataMiddleware.js","webpack://daocloud/./node_modules/instantsearch.js/es/lib/routers/history.js","webpack://daocloud/./node_modules/instantsearch.js/es/lib/stateMappings/simple.js","webpack://daocloud/./node_modules/instantsearch.js/es/lib/utils/isEqual.js","webpack://daocloud/./node_modules/instantsearch.js/es/middlewares/createRouterMiddleware.js","webpack://daocloud/./node_modules/instantsearch.js/es/lib/suit.js","webpack://daocloud/./node_modules/instantsearch.js/es/lib/utils/getPropertyByPath.js","webpack://daocloud/./node_modules/instantsearch.js/es/helpers/highlight.js","webpack://daocloud/./node_modules/instantsearch.js/es/lib/utils/concatHighlightedParts.js","webpack://daocloud/./node_modules/instantsearch.js/es/lib/utils/getHighlightFromSiblings.js","webpack://daocloud/./node_modules/instantsearch.js/es/lib/utils/reverseHighlightedParts.js","webpack://daocloud/./node_modules/instantsearch.js/es/lib/utils/getHighlightedParts.js","webpack://daocloud/./node_modules/instantsearch.js/es/helpers/reverseHighlight.js","webpack://daocloud/./node_modules/instantsearch.js/es/helpers/snippet.js","webpack://daocloud/./node_modules/instantsearch.js/es/helpers/reverseSnippet.js","webpack://daocloud/./node_modules/instantsearch.js/es/helpers/insights.js","webpack://daocloud/./node_modules/instantsearch.js/es/lib/createHelpers.js","webpack://daocloud/./node_modules/instantsearch.js/es/lib/formatNumber.js","webpack://daocloud/./node_modules/instantsearch.js/es/lib/utils/defer.js","webpack://daocloud/./node_modules/instantsearch.js/es/lib/utils/setIndexHelperState.js","webpack://daocloud/./node_modules/instantsearch.js/es/lib/InstantSearch.js","webpack://daocloud/./node_modules/instantsearch.js/es/lib/version.js","webpack://daocloud/./node_modules/instantsearch.js/es/lib/utils/getAppIdAndApiKey.js","webpack://daocloud/./node_modules/instantsearch.js/es/lib/utils/find.js","webpack://daocloud/./node_modules/react-instantsearch/node_modules/react-instantsearch-core/dist/es/version.js","webpack://daocloud/./node_modules/react-instantsearch/node_modules/react-instantsearch-core/dist/es/lib/useInstantSearchApi.js","webpack://daocloud/./node_modules/react-instantsearch/node_modules/react-instantsearch-core/dist/es/components/InstantSearch.js","webpack://daocloud/./node_modules/instantsearch.js/es/lib/utils/createSendEventForHits.js","webpack://daocloud/./node_modules/instantsearch.js/es/lib/utils/hits-absolute-position.js","webpack://daocloud/./node_modules/instantsearch.js/es/lib/utils/hits-query-id.js","webpack://daocloud/./node_modules/instantsearch.js/es/connectors/hits/connectHits.js","webpack://daocloud/./node_modules/react-instantsearch/node_modules/react-instantsearch-core/dist/es/connectors/useHits.js","webpack://daocloud/./node_modules/instantsearch.js/es/connectors/search-box/connectSearchBox.js","webpack://daocloud/./node_modules/react-instantsearch/node_modules/react-instantsearch-core/dist/es/connectors/useSearchBox.js","webpack://daocloud/./node_modules/react-instantsearch/node_modules/react-instantsearch-core/dist/es/lib/createSearchResults.js","webpack://daocloud/./node_modules/react-instantsearch/node_modules/react-instantsearch-core/dist/es/lib/getIndexSearchResults.js","webpack://daocloud/./node_modules/react-instantsearch/node_modules/react-instantsearch-core/dist/es/hooks/useConnector.js","webpack://daocloud/./node_modules/react-instantsearch/node_modules/react-instantsearch-core/dist/es/lib/IndexContext.js","webpack://daocloud/./node_modules/react-instantsearch/node_modules/react-instantsearch-core/dist/es/lib/InstantSearchContext.js","webpack://daocloud/./node_modules/react-instantsearch/node_modules/react-instantsearch-core/dist/es/lib/dequal.js","webpack://daocloud/./node_modules/react-instantsearch/node_modules/react-instantsearch-core/dist/es/lib/invariant.js","webpack://daocloud/./node_modules/react-instantsearch/node_modules/react-instantsearch-core/dist/es/lib/useForceUpdate.js","webpack://daocloud/./node_modules/react-instantsearch/node_modules/react-instantsearch-core/dist/es/lib/useIndexContext.js","webpack://daocloud/./node_modules/react-instantsearch/node_modules/react-instantsearch-core/dist/es/lib/useInstantSearchContext.js","webpack://daocloud/./node_modules/react-instantsearch/node_modules/react-instantsearch-core/dist/es/lib/InstantSearchSSRContext.js","webpack://daocloud/./node_modules/react-instantsearch/node_modules/react-instantsearch-core/dist/es/lib/useInstantSearchSSRContext.js","webpack://daocloud/./node_modules/react-instantsearch/node_modules/react-instantsearch-core/dist/es/components/InstantSearchServerContext.js","webpack://daocloud/./node_modules/react-instantsearch/node_modules/react-instantsearch-core/dist/es/lib/useInstantSearchServerContext.js","webpack://daocloud/./node_modules/react-instantsearch/node_modules/react-instantsearch-core/dist/es/lib/useIsomorphicLayoutEffect.js","webpack://daocloud/./node_modules/react-instantsearch/node_modules/react-instantsearch-core/dist/es/lib/InstantSearchRSCContext.js","webpack://daocloud/./node_modules/react-instantsearch/node_modules/react-instantsearch-core/dist/es/lib/useRSCContext.js","webpack://daocloud/./node_modules/react-instantsearch/node_modules/react-instantsearch-core/dist/es/lib/useStableValue.js","webpack://daocloud/./node_modules/react-instantsearch/node_modules/react-instantsearch-core/dist/es/lib/use.js","webpack://daocloud/./node_modules/react-instantsearch/node_modules/react-instantsearch-core/dist/es/lib/useWidget.js"],"sourcesContent":["// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nfunction EventEmitter() {\n  this._events = this._events || {};\n  this._maxListeners = this._maxListeners || undefined;\n}\nmodule.exports = EventEmitter;\n\n// Backwards-compat with node 0.10.x\n// EventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nEventEmitter.defaultMaxListeners = 10;\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function(n) {\n  if (!isNumber(n) || n < 0 || isNaN(n))\n    throw TypeError('n must be a positive number');\n  this._maxListeners = n;\n  return this;\n};\n\nEventEmitter.prototype.emit = function(type) {\n  var er, handler, len, args, i, listeners;\n\n  if (!this._events)\n    this._events = {};\n\n  // If there is no 'error' event listener then throw.\n  if (type === 'error') {\n    if (!this._events.error ||\n        (isObject(this._events.error) && !this._events.error.length)) {\n      er = arguments[1];\n      if (er instanceof Error) {\n        throw er; // Unhandled 'error' event\n      } else {\n        // At least give some kind of context to the user\n        var err = new Error('Uncaught, unspecified \"error\" event. (' + er + ')');\n        err.context = er;\n        throw err;\n      }\n    }\n  }\n\n  handler = this._events[type];\n\n  if (isUndefined(handler))\n    return false;\n\n  if (isFunction(handler)) {\n    switch (arguments.length) {\n      // fast cases\n      case 1:\n        handler.call(this);\n        break;\n      case 2:\n        handler.call(this, arguments[1]);\n        break;\n      case 3:\n        handler.call(this, arguments[1], arguments[2]);\n        break;\n      // slower\n      default:\n        args = Array.prototype.slice.call(arguments, 1);\n        handler.apply(this, args);\n    }\n  } else if (isObject(handler)) {\n    args = Array.prototype.slice.call(arguments, 1);\n    listeners = handler.slice();\n    len = listeners.length;\n    for (i = 0; i < len; i++)\n      listeners[i].apply(this, args);\n  }\n\n  return true;\n};\n\nEventEmitter.prototype.addListener = function(type, listener) {\n  var m;\n\n  if (!isFunction(listener))\n    throw TypeError('listener must be a function');\n\n  if (!this._events)\n    this._events = {};\n\n  // To avoid recursion in the case that type === \"newListener\"! Before\n  // adding it to the listeners, first emit \"newListener\".\n  if (this._events.newListener)\n    this.emit('newListener', type,\n              isFunction(listener.listener) ?\n              listener.listener : listener);\n\n  if (!this._events[type])\n    // Optimize the case of one listener. Don't need the extra array object.\n    this._events[type] = listener;\n  else if (isObject(this._events[type]))\n    // If we've already got an array, just append.\n    this._events[type].push(listener);\n  else\n    // Adding the second element, need to change to array.\n    this._events[type] = [this._events[type], listener];\n\n  // Check for listener leak\n  if (isObject(this._events[type]) && !this._events[type].warned) {\n    if (!isUndefined(this._maxListeners)) {\n      m = this._maxListeners;\n    } else {\n      m = EventEmitter.defaultMaxListeners;\n    }\n\n    if (m && m > 0 && this._events[type].length > m) {\n      this._events[type].warned = true;\n      console.error('(node) warning: possible EventEmitter memory ' +\n                    'leak detected. %d listeners added. ' +\n                    'Use emitter.setMaxListeners() to increase limit.',\n                    this._events[type].length);\n      if (typeof console.trace === 'function') {\n        // not supported in IE 10\n        console.trace();\n      }\n    }\n  }\n\n  return this;\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.once = function(type, listener) {\n  if (!isFunction(listener))\n    throw TypeError('listener must be a function');\n\n  var fired = false;\n\n  function g() {\n    this.removeListener(type, g);\n\n    if (!fired) {\n      fired = true;\n      listener.apply(this, arguments);\n    }\n  }\n\n  g.listener = listener;\n  this.on(type, g);\n\n  return this;\n};\n\n// emits a 'removeListener' event iff the listener was removed\nEventEmitter.prototype.removeListener = function(type, listener) {\n  var list, position, length, i;\n\n  if (!isFunction(listener))\n    throw TypeError('listener must be a function');\n\n  if (!this._events || !this._events[type])\n    return this;\n\n  list = this._events[type];\n  length = list.length;\n  position = -1;\n\n  if (list === listener ||\n      (isFunction(list.listener) && list.listener === listener)) {\n    delete this._events[type];\n    if (this._events.removeListener)\n      this.emit('removeListener', type, listener);\n\n  } else if (isObject(list)) {\n    for (i = length; i-- > 0;) {\n      if (list[i] === listener ||\n          (list[i].listener && list[i].listener === listener)) {\n        position = i;\n        break;\n      }\n    }\n\n    if (position < 0)\n      return this;\n\n    if (list.length === 1) {\n      list.length = 0;\n      delete this._events[type];\n    } else {\n      list.splice(position, 1);\n    }\n\n    if (this._events.removeListener)\n      this.emit('removeListener', type, listener);\n  }\n\n  return this;\n};\n\nEventEmitter.prototype.removeAllListeners = function(type) {\n  var key, listeners;\n\n  if (!this._events)\n    return this;\n\n  // not listening for removeListener, no need to emit\n  if (!this._events.removeListener) {\n    if (arguments.length === 0)\n      this._events = {};\n    else if (this._events[type])\n      delete this._events[type];\n    return this;\n  }\n\n  // emit removeListener for all listeners on all events\n  if (arguments.length === 0) {\n    for (key in this._events) {\n      if (key === 'removeListener') continue;\n      this.removeAllListeners(key);\n    }\n    this.removeAllListeners('removeListener');\n    this._events = {};\n    return this;\n  }\n\n  listeners = this._events[type];\n\n  if (isFunction(listeners)) {\n    this.removeListener(type, listeners);\n  } else if (listeners) {\n    // LIFO order\n    while (listeners.length)\n      this.removeListener(type, listeners[listeners.length - 1]);\n  }\n  delete this._events[type];\n\n  return this;\n};\n\nEventEmitter.prototype.listeners = function(type) {\n  var ret;\n  if (!this._events || !this._events[type])\n    ret = [];\n  else if (isFunction(this._events[type]))\n    ret = [this._events[type]];\n  else\n    ret = this._events[type].slice();\n  return ret;\n};\n\nEventEmitter.prototype.listenerCount = function(type) {\n  if (this._events) {\n    var evlistener = this._events[type];\n\n    if (isFunction(evlistener))\n      return 1;\n    else if (evlistener)\n      return evlistener.length;\n  }\n  return 0;\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n  return emitter.listenerCount(type);\n};\n\nfunction isFunction(arg) {\n  return typeof arg === 'function';\n}\n\nfunction isNumber(arg) {\n  return typeof arg === 'number';\n}\n\nfunction isObject(arg) {\n  return typeof arg === 'object' && arg !== null;\n}\n\nfunction isUndefined(arg) {\n  return arg === void 0;\n}\n","'use strict';\n\nvar AlgoliaSearchHelper = require('./src/algoliasearch.helper');\nvar SearchParameters = require('./src/SearchParameters');\nvar SearchResults = require('./src/SearchResults');\n\n/**\n * The algoliasearchHelper module is the function that will let its\n * contains everything needed to use the Algoliasearch\n * Helper. It is a also a function that instanciate the helper.\n * To use the helper, you also need the Algolia JS client v3.\n * @example\n * //using the UMD build\n * var client = algoliasearch('latency', '6be0576ff61c053d5f9a3225e2a90f76');\n * var helper = algoliasearchHelper(client, 'bestbuy', {\n *   facets: ['shipping'],\n *   disjunctiveFacets: ['category']\n * });\n * helper.on('result', function(event) {\n *   console.log(event.results);\n * });\n * helper\n *   .toggleFacetRefinement('category', 'Movies & TV Shows')\n *   .toggleFacetRefinement('shipping', 'Free shipping')\n *   .search();\n * @example\n * // The helper is an event emitter using the node API\n * helper.on('result', updateTheResults);\n * helper.once('result', updateTheResults);\n * helper.removeListener('result', updateTheResults);\n * helper.removeAllListeners('result');\n * @module algoliasearchHelper\n * @param  {AlgoliaSearch} client an AlgoliaSearch client\n * @param  {string} index the name of the index to query\n * @param  {SearchParameters|object} opts an object defining the initial config of the search. It doesn't have to be a {SearchParameters}, just an object containing the properties you need from it.\n * @return {AlgoliaSearchHelper} The helper instance\n */\nfunction algoliasearchHelper(client, index, opts) {\n  return new AlgoliaSearchHelper(client, index, opts);\n}\n\n/**\n * The version currently used\n * @member module:algoliasearchHelper.version\n * @type {number}\n */\nalgoliasearchHelper.version = require('./src/version');\n\n/**\n * Constructor for the Helper.\n * @member module:algoliasearchHelper.AlgoliaSearchHelper\n * @type {AlgoliaSearchHelper}\n */\nalgoliasearchHelper.AlgoliaSearchHelper = AlgoliaSearchHelper;\n\n/**\n * Constructor for the object containing all the parameters of the search.\n * @member module:algoliasearchHelper.SearchParameters\n * @type {SearchParameters}\n */\nalgoliasearchHelper.SearchParameters = SearchParameters;\n\n/**\n * Constructor for the object containing the results of the search.\n * @member module:algoliasearchHelper.SearchResults\n * @type {SearchResults}\n */\nalgoliasearchHelper.SearchResults = SearchResults;\n\nmodule.exports = algoliasearchHelper;\n","'use strict';\n\nvar EventEmitter = require('@algolia/events');\n\nvar inherits = require('../functions/inherits');\n\n/**\n * A DerivedHelper is a way to create sub requests to\n * Algolia from a main helper.\n * @class\n * @classdesc The DerivedHelper provides an event based interface for search callbacks:\n *  - search: when a search is triggered using the `search()` method.\n *  - result: when the response is retrieved from Algolia and is processed.\n *    This event contains a {@link SearchResults} object and the\n *    {@link SearchParameters} corresponding to this answer.\n * @param {AlgoliaSearchHelper} mainHelper the main helper\n * @param {function} fn the function to create the derived state\n */\nfunction DerivedHelper(mainHelper, fn) {\n  this.main = mainHelper;\n  this.fn = fn;\n  this.lastResults = null;\n}\n\ninherits(DerivedHelper, EventEmitter);\n\n/**\n * Detach this helper from the main helper\n * @return {undefined}\n * @throws Error if the derived helper is already detached\n */\nDerivedHelper.prototype.detach = function () {\n  this.removeAllListeners();\n  this.main.detachDerivedHelper(this);\n};\n\nDerivedHelper.prototype.getModifiedState = function (parameters) {\n  return this.fn(parameters);\n};\n\nmodule.exports = DerivedHelper;\n","'use strict';\n\n/**\n * Functions to manipulate refinement lists\n *\n * The RefinementList is not formally defined through a prototype but is based\n * on a specific structure.\n *\n * @module SearchParameters.refinementList\n *\n * @typedef {string[]} SearchParameters.refinementList.Refinements\n * @typedef {Object.<string, SearchParameters.refinementList.Refinements>} SearchParameters.refinementList.RefinementList\n */\n\nvar defaultsPure = require('../functions/defaultsPure');\nvar objectHasKeys = require('../functions/objectHasKeys');\nvar omit = require('../functions/omit');\n\nvar lib = {\n  /**\n   * Adds a refinement to a RefinementList\n   * @param {RefinementList} refinementList the initial list\n   * @param {string} attribute the attribute to refine\n   * @param {string} value the value of the refinement, if the value is not a string it will be converted\n   * @return {RefinementList} a new and updated refinement list\n   */\n  addRefinement: function addRefinement(refinementList, attribute, value) {\n    if (lib.isRefined(refinementList, attribute, value)) {\n      return refinementList;\n    }\n\n    var valueAsString = '' + value;\n\n    var facetRefinement = !refinementList[attribute]\n      ? [valueAsString]\n      : refinementList[attribute].concat(valueAsString);\n\n    var mod = {};\n\n    mod[attribute] = facetRefinement;\n\n    return defaultsPure({}, mod, refinementList);\n  },\n  /**\n   * Removes refinement(s) for an attribute:\n   *  - if the value is specified removes the refinement for the value on the attribute\n   *  - if no value is specified removes all the refinements for this attribute\n   * @param {RefinementList} refinementList the initial list\n   * @param {string} attribute the attribute to refine\n   * @param {string} [value] the value of the refinement\n   * @return {RefinementList} a new and updated refinement lst\n   */\n  removeRefinement: function removeRefinement(\n    refinementList,\n    attribute,\n    value\n  ) {\n    if (value === undefined) {\n      // we use the \"filter\" form of clearRefinement, since it leaves empty values as-is\n      // the form with a string will remove the attribute completely\n      return lib.clearRefinement(refinementList, function (v, f) {\n        return attribute === f;\n      });\n    }\n\n    var valueAsString = '' + value;\n\n    return lib.clearRefinement(refinementList, function (v, f) {\n      return attribute === f && valueAsString === v;\n    });\n  },\n  /**\n   * Toggles the refinement value for an attribute.\n   * @param {RefinementList} refinementList the initial list\n   * @param {string} attribute the attribute to refine\n   * @param {string} value the value of the refinement\n   * @return {RefinementList} a new and updated list\n   */\n  toggleRefinement: function toggleRefinement(\n    refinementList,\n    attribute,\n    value\n  ) {\n    if (value === undefined)\n      throw new Error('toggleRefinement should be used with a value');\n\n    if (lib.isRefined(refinementList, attribute, value)) {\n      return lib.removeRefinement(refinementList, attribute, value);\n    }\n\n    return lib.addRefinement(refinementList, attribute, value);\n  },\n  /**\n   * Clear all or parts of a RefinementList. Depending on the arguments, three\n   * kinds of behavior can happen:\n   *  - if no attribute is provided: clears the whole list\n   *  - if an attribute is provided as a string: clears the list for the specific attribute\n   *  - if an attribute is provided as a function: discards the elements for which the function returns true\n   * @param {RefinementList} refinementList the initial list\n   * @param {string} [attribute] the attribute or function to discard\n   * @param {string} [refinementType] optional parameter to give more context to the attribute function\n   * @return {RefinementList} a new and updated refinement list\n   */\n  clearRefinement: function clearRefinement(\n    refinementList,\n    attribute,\n    refinementType\n  ) {\n    if (attribute === undefined) {\n      // return the same object if the list is already empty\n      // this is mainly for tests, as it doesn't have much impact on performance\n      if (!objectHasKeys(refinementList)) {\n        return refinementList;\n      }\n      return {};\n    } else if (typeof attribute === 'string') {\n      return omit(refinementList, [attribute]);\n    } else if (typeof attribute === 'function') {\n      var hasChanged = false;\n\n      var newRefinementList = Object.keys(refinementList).reduce(function (\n        memo,\n        key\n      ) {\n        var values = refinementList[key] || [];\n        var facetList = values.filter(function (value) {\n          return !attribute(value, key, refinementType);\n        });\n\n        if (facetList.length !== values.length) {\n          hasChanged = true;\n        }\n\n        memo[key] = facetList;\n\n        return memo;\n      },\n      {});\n\n      if (hasChanged) return newRefinementList;\n      return refinementList;\n    }\n\n    // We return nothing if the attribute is not undefined, a string or a function,\n    // as it is not a valid value for a refinement\n    return undefined;\n  },\n  /**\n   * Test if the refinement value is used for the attribute. If no refinement value\n   * is provided, test if the refinementList contains any refinement for the\n   * given attribute.\n   * @param {RefinementList} refinementList the list of refinement\n   * @param {string} attribute name of the attribute\n   * @param {string} [refinementValue] value of the filter/refinement\n   * @return {boolean} true if the attribute is refined, false otherwise\n   */\n  isRefined: function isRefined(refinementList, attribute, refinementValue) {\n    var containsRefinements =\n      Boolean(refinementList[attribute]) &&\n      refinementList[attribute].length > 0;\n\n    if (refinementValue === undefined || !containsRefinements) {\n      return containsRefinements;\n    }\n\n    var refinementValueAsString = '' + refinementValue;\n\n    return refinementList[attribute].indexOf(refinementValueAsString) !== -1;\n  },\n};\n\nmodule.exports = lib;\n","'use strict';\n\nvar defaultsPure = require('../functions/defaultsPure');\nvar find = require('../functions/find');\nvar intersection = require('../functions/intersection');\nvar merge = require('../functions/merge');\nvar objectHasKeys = require('../functions/objectHasKeys');\nvar omit = require('../functions/omit');\nvar valToNumber = require('../functions/valToNumber');\nvar isValidUserToken = require('../utils/isValidUserToken');\n\nvar RefinementList = require('./RefinementList');\n\n/**\n * isEqual, but only for numeric refinement values, possible values:\n * - 5\n * - [5]\n * - [[5]]\n * - [[5,5],[4]]\n * @param {any} a numeric refinement value\n * @param {any} b numeric refinement value\n * @return {boolean} true if the values are equal\n */\nfunction isEqualNumericRefinement(a, b) {\n  if (Array.isArray(a) && Array.isArray(b)) {\n    return (\n      a.length === b.length &&\n      a.every(function (el, i) {\n        return isEqualNumericRefinement(b[i], el);\n      })\n    );\n  }\n  return a === b;\n}\n\n/**\n * like _.find but using deep equality to be able to use it\n * to find arrays.\n * @private\n * @param {any[]} array array to search into (elements are base or array of base)\n * @param {any} searchedValue the value we're looking for (base or array of base)\n * @return {any} the searched value or undefined\n */\nfunction findArray(array, searchedValue) {\n  return find(array, function (currentValue) {\n    return isEqualNumericRefinement(currentValue, searchedValue);\n  });\n}\n\n/**\n * The facet list is the structure used to store the list of values used to\n * filter a single attribute.\n * @typedef {string[]} SearchParameters.FacetList\n */\n\n/**\n * Structure to store numeric filters with the operator as the key. The supported operators\n * are `=`, `>`, `<`, `>=`, `<=` and `!=`.\n * @typedef {Object.<string, Array.<number|number[]>>} SearchParameters.OperatorList\n */\n\n/**\n * SearchParameters is the data structure that contains all the information\n * usable for making a search to Algolia API. It doesn't do the search itself,\n * nor does it contains logic about the parameters.\n * It is an immutable object, therefore it has been created in a way that each\n * changes does not change the object itself but returns a copy with the\n * modification.\n * This object should probably not be instantiated outside of the helper. It will\n * be provided when needed. This object is documented for reference as you'll\n * get it from events generated by the {@link AlgoliaSearchHelper}.\n * If need be, instantiate the Helper from the factory function {@link SearchParameters.make}\n * @constructor\n * @classdesc contains all the parameters of a search\n * @param {object|SearchParameters} newParameters existing parameters or partial object\n * for the properties of a new SearchParameters\n * @see SearchParameters.make\n * @example <caption>SearchParameters of the first query in\n *   <a href=\"http://demos.algolia.com/instant-search-demo/\">the instant search demo</a></caption>\n{\n   \"query\": \"\",\n   \"disjunctiveFacets\": [\n      \"customerReviewCount\",\n      \"category\",\n      \"salePrice_range\",\n      \"manufacturer\"\n  ],\n   \"maxValuesPerFacet\": 30,\n   \"page\": 0,\n   \"hitsPerPage\": 10,\n   \"facets\": [\n      \"type\",\n      \"shipping\"\n  ]\n}\n */\nfunction SearchParameters(newParameters) {\n  var params = newParameters\n    ? SearchParameters._parseNumbers(newParameters)\n    : {};\n\n  if (params.userToken !== undefined && !isValidUserToken(params.userToken)) {\n    // eslint-disable-next-line no-console\n    console.warn(\n      '[algoliasearch-helper] The `userToken` parameter is invalid. This can lead to wrong analytics.\\n  - Format: [a-zA-Z0-9_-]{1,64}'\n    );\n  }\n  /**\n   * This attribute contains the list of all the conjunctive facets\n   * used. This list will be added to requested facets in the\n   * [facets attribute](https://www.algolia.com/doc/rest-api/search#param-facets) sent to algolia.\n   * @member {string[]}\n   */\n  this.facets = params.facets || [];\n  /**\n   * This attribute contains the list of all the disjunctive facets\n   * used. This list will be added to requested facets in the\n   * [facets attribute](https://www.algolia.com/doc/rest-api/search#param-facets) sent to algolia.\n   * @member {string[]}\n   */\n  this.disjunctiveFacets = params.disjunctiveFacets || [];\n  /**\n   * This attribute contains the list of all the hierarchical facets\n   * used. This list will be added to requested facets in the\n   * [facets attribute](https://www.algolia.com/doc/rest-api/search#param-facets) sent to algolia.\n   * Hierarchical facets are a sub type of disjunctive facets that\n   * let you filter faceted attributes hierarchically.\n   * @member {string[]|object[]}\n   */\n  this.hierarchicalFacets = params.hierarchicalFacets || [];\n\n  // Refinements\n  /**\n   * This attribute contains all the filters that need to be\n   * applied on the conjunctive facets. Each facet must be properly\n   * defined in the `facets` attribute.\n   *\n   * The key is the name of the facet, and the `FacetList` contains all\n   * filters selected for the associated facet name.\n   *\n   * When querying algolia, the values stored in this attribute will\n   * be translated into the `facetFilters` attribute.\n   * @member {Object.<string, SearchParameters.FacetList>}\n   */\n  this.facetsRefinements = params.facetsRefinements || {};\n  /**\n   * This attribute contains all the filters that need to be\n   * excluded from the conjunctive facets. Each facet must be properly\n   * defined in the `facets` attribute.\n   *\n   * The key is the name of the facet, and the `FacetList` contains all\n   * filters excluded for the associated facet name.\n   *\n   * When querying algolia, the values stored in this attribute will\n   * be translated into the `facetFilters` attribute.\n   * @member {Object.<string, SearchParameters.FacetList>}\n   */\n  this.facetsExcludes = params.facetsExcludes || {};\n  /**\n   * This attribute contains all the filters that need to be\n   * applied on the disjunctive facets. Each facet must be properly\n   * defined in the `disjunctiveFacets` attribute.\n   *\n   * The key is the name of the facet, and the `FacetList` contains all\n   * filters selected for the associated facet name.\n   *\n   * When querying algolia, the values stored in this attribute will\n   * be translated into the `facetFilters` attribute.\n   * @member {Object.<string, SearchParameters.FacetList>}\n   */\n  this.disjunctiveFacetsRefinements = params.disjunctiveFacetsRefinements || {};\n  /**\n   * This attribute contains all the filters that need to be\n   * applied on the numeric attributes.\n   *\n   * The key is the name of the attribute, and the value is the\n   * filters to apply to this attribute.\n   *\n   * When querying algolia, the values stored in this attribute will\n   * be translated into the `numericFilters` attribute.\n   * @member {Object.<string, SearchParameters.OperatorList>}\n   */\n  this.numericRefinements = params.numericRefinements || {};\n  /**\n   * This attribute contains all the tags used to refine the query.\n   *\n   * When querying algolia, the values stored in this attribute will\n   * be translated into the `tagFilters` attribute.\n   * @member {string[]}\n   */\n  this.tagRefinements = params.tagRefinements || [];\n  /**\n   * This attribute contains all the filters that need to be\n   * applied on the hierarchical facets. Each facet must be properly\n   * defined in the `hierarchicalFacets` attribute.\n   *\n   * The key is the name of the facet, and the `FacetList` contains all\n   * filters selected for the associated facet name. The FacetList values\n   * are structured as a string that contain the values for each level\n   * separated by the configured separator.\n   *\n   * When querying algolia, the values stored in this attribute will\n   * be translated into the `facetFilters` attribute.\n   * @member {Object.<string, SearchParameters.FacetList>}\n   */\n  this.hierarchicalFacetsRefinements =\n    params.hierarchicalFacetsRefinements || {};\n\n  // eslint-disable-next-line consistent-this\n  var self = this;\n  Object.keys(params).forEach(function (paramName) {\n    var isKeyKnown = SearchParameters.PARAMETERS.indexOf(paramName) !== -1;\n    var isValueDefined = params[paramName] !== undefined;\n\n    if (!isKeyKnown && isValueDefined) {\n      self[paramName] = params[paramName];\n    }\n  });\n}\n\n/**\n * List all the properties in SearchParameters and therefore all the known Algolia properties\n * This doesn't contain any beta/hidden features.\n * @private\n */\nSearchParameters.PARAMETERS = Object.keys(new SearchParameters());\n\n/**\n * @private\n * @param {object} partialState full or part of a state\n * @return {object} a new object with the number keys as number\n */\nSearchParameters._parseNumbers = function (partialState) {\n  // Do not parse numbers again in SearchParameters, they ought to be parsed already\n  if (partialState instanceof SearchParameters) return partialState;\n\n  var numbers = {};\n\n  var numberKeys = [\n    'aroundPrecision',\n    'aroundRadius',\n    'getRankingInfo',\n    'minWordSizefor2Typos',\n    'minWordSizefor1Typo',\n    'page',\n    'maxValuesPerFacet',\n    'distinct',\n    'minimumAroundRadius',\n    'hitsPerPage',\n    'minProximity',\n  ];\n\n  numberKeys.forEach(function (k) {\n    var value = partialState[k];\n    if (typeof value === 'string') {\n      var parsedValue = parseFloat(value);\n      // global isNaN is ok to use here, value is only number or NaN\n      numbers[k] = isNaN(parsedValue) ? value : parsedValue;\n    }\n  });\n\n  // there's two formats of insideBoundingBox, we need to parse\n  // the one which is an array of float geo rectangles\n  if (Array.isArray(partialState.insideBoundingBox)) {\n    numbers.insideBoundingBox = partialState.insideBoundingBox.map(function (\n      geoRect\n    ) {\n      if (Array.isArray(geoRect)) {\n        return geoRect.map(function (value) {\n          return parseFloat(value);\n        });\n      }\n      return geoRect;\n    });\n  }\n\n  if (partialState.numericRefinements) {\n    var numericRefinements = {};\n    Object.keys(partialState.numericRefinements).forEach(function (attribute) {\n      var operators = partialState.numericRefinements[attribute] || {};\n      numericRefinements[attribute] = {};\n      Object.keys(operators).forEach(function (operator) {\n        var values = operators[operator];\n        var parsedValues = values.map(function (v) {\n          if (Array.isArray(v)) {\n            return v.map(function (vPrime) {\n              if (typeof vPrime === 'string') {\n                return parseFloat(vPrime);\n              }\n              return vPrime;\n            });\n          } else if (typeof v === 'string') {\n            return parseFloat(v);\n          }\n          return v;\n        });\n        numericRefinements[attribute][operator] = parsedValues;\n      });\n    });\n    numbers.numericRefinements = numericRefinements;\n  }\n\n  return merge({}, partialState, numbers);\n};\n\n/**\n * Factory for SearchParameters\n * @param {object|SearchParameters} newParameters existing parameters or partial\n * object for the properties of a new SearchParameters\n * @return {SearchParameters} frozen instance of SearchParameters\n */\nSearchParameters.make = function makeSearchParameters(newParameters) {\n  var instance = new SearchParameters(newParameters);\n\n  var hierarchicalFacets = newParameters.hierarchicalFacets || [];\n  hierarchicalFacets.forEach(function (facet) {\n    if (facet.rootPath) {\n      var currentRefinement = instance.getHierarchicalRefinement(facet.name);\n\n      if (\n        currentRefinement.length > 0 &&\n        currentRefinement[0].indexOf(facet.rootPath) !== 0\n      ) {\n        instance = instance.clearRefinements(facet.name);\n      }\n\n      // get it again in case it has been cleared\n      currentRefinement = instance.getHierarchicalRefinement(facet.name);\n      if (currentRefinement.length === 0) {\n        instance = instance.toggleHierarchicalFacetRefinement(\n          facet.name,\n          facet.rootPath\n        );\n      }\n    }\n  });\n\n  return instance;\n};\n\n/**\n * Validates the new parameters based on the previous state\n * @param {SearchParameters} currentState the current state\n * @param {object|SearchParameters} parameters the new parameters to set\n * @return {Error|null} Error if the modification is invalid, null otherwise\n */\nSearchParameters.validate = function (currentState, parameters) {\n  var params = parameters || {};\n\n  if (\n    currentState.tagFilters &&\n    params.tagRefinements &&\n    params.tagRefinements.length > 0\n  ) {\n    return new Error(\n      '[Tags] Cannot switch from the managed tag API to the advanced API. It is probably ' +\n        'an error, if it is really what you want, you should first clear the tags with clearTags method.'\n    );\n  }\n\n  if (currentState.tagRefinements.length > 0 && params.tagFilters) {\n    return new Error(\n      '[Tags] Cannot switch from the advanced tag API to the managed API. It is probably ' +\n        'an error, if it is not, you should first clear the tags with clearTags method.'\n    );\n  }\n\n  if (\n    currentState.numericFilters &&\n    params.numericRefinements &&\n    objectHasKeys(params.numericRefinements)\n  ) {\n    return new Error(\n      \"[Numeric filters] Can't switch from the advanced to the managed API. It\" +\n        ' is probably an error, if this is really what you want, you have to first' +\n        ' clear the numeric filters.'\n    );\n  }\n\n  if (objectHasKeys(currentState.numericRefinements) && params.numericFilters) {\n    return new Error(\n      \"[Numeric filters] Can't switch from the managed API to the advanced. It\" +\n        ' is probably an error, if this is really what you want, you have to first' +\n        ' clear the numeric filters.'\n    );\n  }\n\n  return null;\n};\n\nSearchParameters.prototype = {\n  constructor: SearchParameters,\n\n  /**\n   * Remove all refinements (disjunctive + conjunctive + excludes + numeric filters)\n   * @method\n   * @param {undefined|string|SearchParameters.clearCallback} [attribute] optional string or function\n   * - If not given, means to clear all the filters.\n   * - If `string`, means to clear all refinements for the `attribute` named filter.\n   * - If `function`, means to clear all the refinements that return truthy values.\n   * @return {SearchParameters} new instance with filters cleared\n   */\n  clearRefinements: function clearRefinements(attribute) {\n    var patch = {\n      numericRefinements: this._clearNumericRefinements(attribute),\n      facetsRefinements: RefinementList.clearRefinement(\n        this.facetsRefinements,\n        attribute,\n        'conjunctiveFacet'\n      ),\n      facetsExcludes: RefinementList.clearRefinement(\n        this.facetsExcludes,\n        attribute,\n        'exclude'\n      ),\n      disjunctiveFacetsRefinements: RefinementList.clearRefinement(\n        this.disjunctiveFacetsRefinements,\n        attribute,\n        'disjunctiveFacet'\n      ),\n      hierarchicalFacetsRefinements: RefinementList.clearRefinement(\n        this.hierarchicalFacetsRefinements,\n        attribute,\n        'hierarchicalFacet'\n      ),\n    };\n    if (\n      patch.numericRefinements === this.numericRefinements &&\n      patch.facetsRefinements === this.facetsRefinements &&\n      patch.facetsExcludes === this.facetsExcludes &&\n      patch.disjunctiveFacetsRefinements ===\n        this.disjunctiveFacetsRefinements &&\n      patch.hierarchicalFacetsRefinements === this.hierarchicalFacetsRefinements\n    ) {\n      return this;\n    }\n    return this.setQueryParameters(patch);\n  },\n  /**\n   * Remove all the refined tags from the SearchParameters\n   * @method\n   * @return {SearchParameters} new instance with tags cleared\n   */\n  clearTags: function clearTags() {\n    if (this.tagFilters === undefined && this.tagRefinements.length === 0)\n      return this;\n\n    return this.setQueryParameters({\n      tagFilters: undefined,\n      tagRefinements: [],\n    });\n  },\n  /**\n   * Set the index.\n   * @method\n   * @param {string} index the index name\n   * @return {SearchParameters} new instance\n   */\n  setIndex: function setIndex(index) {\n    if (index === this.index) return this;\n\n    return this.setQueryParameters({\n      index: index,\n    });\n  },\n  /**\n   * Query setter\n   * @method\n   * @param {string} newQuery value for the new query\n   * @return {SearchParameters} new instance\n   */\n  setQuery: function setQuery(newQuery) {\n    if (newQuery === this.query) return this;\n\n    return this.setQueryParameters({\n      query: newQuery,\n    });\n  },\n  /**\n   * Page setter\n   * @method\n   * @param {number} newPage new page number\n   * @return {SearchParameters} new instance\n   */\n  setPage: function setPage(newPage) {\n    if (newPage === this.page) return this;\n\n    return this.setQueryParameters({\n      page: newPage,\n    });\n  },\n  /**\n   * Facets setter\n   * The facets are the simple facets, used for conjunctive (and) faceting.\n   * @method\n   * @param {string[]} facets all the attributes of the algolia records used for conjunctive faceting\n   * @return {SearchParameters} new instance\n   */\n  setFacets: function setFacets(facets) {\n    return this.setQueryParameters({\n      facets: facets,\n    });\n  },\n  /**\n   * Disjunctive facets setter\n   * Change the list of disjunctive (or) facets the helper chan handle.\n   * @method\n   * @param {string[]} facets all the attributes of the algolia records used for disjunctive faceting\n   * @return {SearchParameters} new instance\n   */\n  setDisjunctiveFacets: function setDisjunctiveFacets(facets) {\n    return this.setQueryParameters({\n      disjunctiveFacets: facets,\n    });\n  },\n  /**\n   * HitsPerPage setter\n   * Hits per page represents the number of hits retrieved for this query\n   * @method\n   * @param {number} n number of hits retrieved per page of results\n   * @return {SearchParameters} new instance\n   */\n  setHitsPerPage: function setHitsPerPage(n) {\n    if (this.hitsPerPage === n) return this;\n\n    return this.setQueryParameters({\n      hitsPerPage: n,\n    });\n  },\n  /**\n   * typoTolerance setter\n   * Set the value of typoTolerance\n   * @method\n   * @param {string} typoTolerance new value of typoTolerance (\"true\", \"false\", \"min\" or \"strict\")\n   * @return {SearchParameters} new instance\n   */\n  setTypoTolerance: function setTypoTolerance(typoTolerance) {\n    if (this.typoTolerance === typoTolerance) return this;\n\n    return this.setQueryParameters({\n      typoTolerance: typoTolerance,\n    });\n  },\n  /**\n   * Add a numeric filter for a given attribute\n   * When value is an array, they are combined with OR\n   * When value is a single value, it will combined with AND\n   * @method\n   * @param {string} attribute attribute to set the filter on\n   * @param {string} operator operator of the filter (possible values: =, >, >=, <, <=, !=)\n   * @param {number | number[]} value value of the filter\n   * @return {SearchParameters} new instance\n   * @example\n   * // for price = 50 or 40\n   * state.addNumericRefinement('price', '=', [50, 40]);\n   * @example\n   * // for size = 38 and 40\n   * state.addNumericRefinement('size', '=', 38);\n   * state.addNumericRefinement('size', '=', 40);\n   */\n  addNumericRefinement: function (attribute, operator, value) {\n    var val = valToNumber(value);\n\n    if (this.isNumericRefined(attribute, operator, val)) return this;\n\n    var mod = merge({}, this.numericRefinements);\n\n    mod[attribute] = merge({}, mod[attribute]);\n\n    if (mod[attribute][operator]) {\n      // Array copy\n      mod[attribute][operator] = mod[attribute][operator].slice();\n      // Add the element. Concat can't be used here because value can be an array.\n      mod[attribute][operator].push(val);\n    } else {\n      mod[attribute][operator] = [val];\n    }\n\n    return this.setQueryParameters({\n      numericRefinements: mod,\n    });\n  },\n  /**\n   * Get the list of conjunctive refinements for a single facet\n   * @param {string} facetName name of the attribute used for faceting\n   * @return {string[]} list of refinements\n   */\n  getConjunctiveRefinements: function (facetName) {\n    if (!this.isConjunctiveFacet(facetName)) {\n      return [];\n    }\n    return this.facetsRefinements[facetName] || [];\n  },\n  /**\n   * Get the list of disjunctive refinements for a single facet\n   * @param {string} facetName name of the attribute used for faceting\n   * @return {string[]} list of refinements\n   */\n  getDisjunctiveRefinements: function (facetName) {\n    if (!this.isDisjunctiveFacet(facetName)) {\n      return [];\n    }\n    return this.disjunctiveFacetsRefinements[facetName] || [];\n  },\n  /**\n   * Get the list of hierarchical refinements for a single facet\n   * @param {string} facetName name of the attribute used for faceting\n   * @return {string[]} list of refinements\n   */\n  getHierarchicalRefinement: function (facetName) {\n    // we send an array but we currently do not support multiple\n    // hierarchicalRefinements for a hierarchicalFacet\n    return this.hierarchicalFacetsRefinements[facetName] || [];\n  },\n  /**\n   * Get the list of exclude refinements for a single facet\n   * @param {string} facetName name of the attribute used for faceting\n   * @return {string[]} list of refinements\n   */\n  getExcludeRefinements: function (facetName) {\n    if (!this.isConjunctiveFacet(facetName)) {\n      return [];\n    }\n    return this.facetsExcludes[facetName] || [];\n  },\n\n  /**\n   * Remove all the numeric filter for a given (attribute, operator)\n   * @method\n   * @param {string} attribute attribute to set the filter on\n   * @param {string} [operator] operator of the filter (possible values: =, >, >=, <, <=, !=)\n   * @param {number} [number] the value to be removed\n   * @return {SearchParameters} new instance\n   */\n  removeNumericRefinement: function (attribute, operator, number) {\n    var paramValue = number;\n    if (paramValue !== undefined) {\n      if (!this.isNumericRefined(attribute, operator, paramValue)) {\n        return this;\n      }\n      return this.setQueryParameters({\n        numericRefinements: this._clearNumericRefinements(function (\n          value,\n          key\n        ) {\n          return (\n            key === attribute &&\n            value.op === operator &&\n            isEqualNumericRefinement(value.val, valToNumber(paramValue))\n          );\n        }),\n      });\n    } else if (operator !== undefined) {\n      if (!this.isNumericRefined(attribute, operator)) return this;\n      return this.setQueryParameters({\n        numericRefinements: this._clearNumericRefinements(function (\n          value,\n          key\n        ) {\n          return key === attribute && value.op === operator;\n        }),\n      });\n    }\n\n    if (!this.isNumericRefined(attribute)) return this;\n    return this.setQueryParameters({\n      numericRefinements: this._clearNumericRefinements(function (value, key) {\n        return key === attribute;\n      }),\n    });\n  },\n  /**\n   * Get the list of numeric refinements for a single facet\n   * @param {string} facetName name of the attribute used for faceting\n   * @return {SearchParameters.OperatorList} list of refinements\n   */\n  getNumericRefinements: function (facetName) {\n    return this.numericRefinements[facetName] || {};\n  },\n  /**\n   * Return the current refinement for the (attribute, operator)\n   * @param {string} attribute attribute in the record\n   * @param {string} operator operator applied on the refined values\n   * @return {Array.<number|number[]>} refined values\n   */\n  getNumericRefinement: function (attribute, operator) {\n    return (\n      this.numericRefinements[attribute] &&\n      this.numericRefinements[attribute][operator]\n    );\n  },\n  /**\n   * Clear numeric filters.\n   * @method\n   * @private\n   * @param {string|SearchParameters.clearCallback} [attribute] optional string or function\n   * - If not given, means to clear all the filters.\n   * - If `string`, means to clear all refinements for the `attribute` named filter.\n   * - If `function`, means to clear all the refinements that return truthy values.\n   * @return {Object.<string, OperatorList>} new numeric refinements\n   */\n  _clearNumericRefinements: function _clearNumericRefinements(attribute) {\n    if (attribute === undefined) {\n      if (!objectHasKeys(this.numericRefinements)) {\n        return this.numericRefinements;\n      }\n      return {};\n    } else if (typeof attribute === 'string') {\n      return omit(this.numericRefinements, [attribute]);\n    } else if (typeof attribute === 'function') {\n      var hasChanged = false;\n      var numericRefinements = this.numericRefinements;\n      var newNumericRefinements = Object.keys(numericRefinements).reduce(\n        function (memo, key) {\n          var operators = numericRefinements[key];\n          var operatorList = {};\n\n          operators = operators || {};\n          Object.keys(operators).forEach(function (operator) {\n            var values = operators[operator] || [];\n            var outValues = [];\n            values.forEach(function (value) {\n              var predicateResult = attribute(\n                { val: value, op: operator },\n                key,\n                'numeric'\n              );\n              if (!predicateResult) outValues.push(value);\n            });\n            if (outValues.length !== values.length) {\n              hasChanged = true;\n            }\n            operatorList[operator] = outValues;\n          });\n\n          memo[key] = operatorList;\n\n          return memo;\n        },\n        {}\n      );\n\n      if (hasChanged) return newNumericRefinements;\n      return this.numericRefinements;\n    }\n\n    // We return nothing if the attribute is not undefined, a string or a function,\n    // as it is not a valid value for a refinement\n    return undefined;\n  },\n  /**\n   * Add a facet to the facets attribute of the helper configuration, if it\n   * isn't already present.\n   * @method\n   * @param {string} facet facet name to add\n   * @return {SearchParameters} new instance\n   */\n  addFacet: function addFacet(facet) {\n    if (this.isConjunctiveFacet(facet)) {\n      return this;\n    }\n\n    return this.setQueryParameters({\n      facets: this.facets.concat([facet]),\n    });\n  },\n  /**\n   * Add a disjunctive facet to the disjunctiveFacets attribute of the helper\n   * configuration, if it isn't already present.\n   * @method\n   * @param {string} facet disjunctive facet name to add\n   * @return {SearchParameters} new instance\n   */\n  addDisjunctiveFacet: function addDisjunctiveFacet(facet) {\n    if (this.isDisjunctiveFacet(facet)) {\n      return this;\n    }\n\n    return this.setQueryParameters({\n      disjunctiveFacets: this.disjunctiveFacets.concat([facet]),\n    });\n  },\n  /**\n   * Add a hierarchical facet to the hierarchicalFacets attribute of the helper\n   * configuration.\n   * @method\n   * @param {object} hierarchicalFacet hierarchical facet to add\n   * @return {SearchParameters} new instance\n   * @throws will throw an error if a hierarchical facet with the same name was already declared\n   */\n  addHierarchicalFacet: function addHierarchicalFacet(hierarchicalFacet) {\n    if (this.isHierarchicalFacet(hierarchicalFacet.name)) {\n      throw new Error(\n        'Cannot declare two hierarchical facets with the same name: `' +\n          hierarchicalFacet.name +\n          '`'\n      );\n    }\n\n    return this.setQueryParameters({\n      hierarchicalFacets: this.hierarchicalFacets.concat([hierarchicalFacet]),\n    });\n  },\n  /**\n   * Add a refinement on a \"normal\" facet\n   * @method\n   * @param {string} facet attribute to apply the faceting on\n   * @param {string} value value of the attribute (will be converted to string)\n   * @return {SearchParameters} new instance\n   */\n  addFacetRefinement: function addFacetRefinement(facet, value) {\n    if (!this.isConjunctiveFacet(facet)) {\n      throw new Error(\n        facet +\n          ' is not defined in the facets attribute of the helper configuration'\n      );\n    }\n    if (RefinementList.isRefined(this.facetsRefinements, facet, value))\n      return this;\n\n    return this.setQueryParameters({\n      facetsRefinements: RefinementList.addRefinement(\n        this.facetsRefinements,\n        facet,\n        value\n      ),\n    });\n  },\n  /**\n   * Exclude a value from a \"normal\" facet\n   * @method\n   * @param {string} facet attribute to apply the exclusion on\n   * @param {string} value value of the attribute (will be converted to string)\n   * @return {SearchParameters} new instance\n   */\n  addExcludeRefinement: function addExcludeRefinement(facet, value) {\n    if (!this.isConjunctiveFacet(facet)) {\n      throw new Error(\n        facet +\n          ' is not defined in the facets attribute of the helper configuration'\n      );\n    }\n    if (RefinementList.isRefined(this.facetsExcludes, facet, value))\n      return this;\n\n    return this.setQueryParameters({\n      facetsExcludes: RefinementList.addRefinement(\n        this.facetsExcludes,\n        facet,\n        value\n      ),\n    });\n  },\n  /**\n   * Adds a refinement on a disjunctive facet.\n   * @method\n   * @param {string} facet attribute to apply the faceting on\n   * @param {string} value value of the attribute (will be converted to string)\n   * @return {SearchParameters} new instance\n   */\n  addDisjunctiveFacetRefinement: function addDisjunctiveFacetRefinement(\n    facet,\n    value\n  ) {\n    if (!this.isDisjunctiveFacet(facet)) {\n      throw new Error(\n        facet +\n          ' is not defined in the disjunctiveFacets attribute of the helper configuration'\n      );\n    }\n\n    if (\n      RefinementList.isRefined(this.disjunctiveFacetsRefinements, facet, value)\n    )\n      return this;\n\n    return this.setQueryParameters({\n      disjunctiveFacetsRefinements: RefinementList.addRefinement(\n        this.disjunctiveFacetsRefinements,\n        facet,\n        value\n      ),\n    });\n  },\n  /**\n   * addTagRefinement adds a tag to the list used to filter the results\n   * @param {string} tag tag to be added\n   * @return {SearchParameters} new instance\n   */\n  addTagRefinement: function addTagRefinement(tag) {\n    if (this.isTagRefined(tag)) return this;\n\n    var modification = {\n      tagRefinements: this.tagRefinements.concat(tag),\n    };\n\n    return this.setQueryParameters(modification);\n  },\n  /**\n   * Remove a facet from the facets attribute of the helper configuration, if it\n   * is present.\n   * @method\n   * @param {string} facet facet name to remove\n   * @return {SearchParameters} new instance\n   */\n  removeFacet: function removeFacet(facet) {\n    if (!this.isConjunctiveFacet(facet)) {\n      return this;\n    }\n\n    return this.clearRefinements(facet).setQueryParameters({\n      facets: this.facets.filter(function (f) {\n        return f !== facet;\n      }),\n    });\n  },\n  /**\n   * Remove a disjunctive facet from the disjunctiveFacets attribute of the\n   * helper configuration, if it is present.\n   * @method\n   * @param {string} facet disjunctive facet name to remove\n   * @return {SearchParameters} new instance\n   */\n  removeDisjunctiveFacet: function removeDisjunctiveFacet(facet) {\n    if (!this.isDisjunctiveFacet(facet)) {\n      return this;\n    }\n\n    return this.clearRefinements(facet).setQueryParameters({\n      disjunctiveFacets: this.disjunctiveFacets.filter(function (f) {\n        return f !== facet;\n      }),\n    });\n  },\n  /**\n   * Remove a hierarchical facet from the hierarchicalFacets attribute of the\n   * helper configuration, if it is present.\n   * @method\n   * @param {string} facet hierarchical facet name to remove\n   * @return {SearchParameters} new instance\n   */\n  removeHierarchicalFacet: function removeHierarchicalFacet(facet) {\n    if (!this.isHierarchicalFacet(facet)) {\n      return this;\n    }\n\n    return this.clearRefinements(facet).setQueryParameters({\n      hierarchicalFacets: this.hierarchicalFacets.filter(function (f) {\n        return f.name !== facet;\n      }),\n    });\n  },\n  /**\n   * Remove a refinement set on facet. If a value is provided, it will clear the\n   * refinement for the given value, otherwise it will clear all the refinement\n   * values for the faceted attribute.\n   * @method\n   * @param {string} facet name of the attribute used for faceting\n   * @param {string} [value] value used to filter\n   * @return {SearchParameters} new instance\n   */\n  removeFacetRefinement: function removeFacetRefinement(facet, value) {\n    if (!this.isConjunctiveFacet(facet)) {\n      throw new Error(\n        facet +\n          ' is not defined in the facets attribute of the helper configuration'\n      );\n    }\n    if (!RefinementList.isRefined(this.facetsRefinements, facet, value))\n      return this;\n\n    return this.setQueryParameters({\n      facetsRefinements: RefinementList.removeRefinement(\n        this.facetsRefinements,\n        facet,\n        value\n      ),\n    });\n  },\n  /**\n   * Remove a negative refinement on a facet\n   * @method\n   * @param {string} facet name of the attribute used for faceting\n   * @param {string} value value used to filter\n   * @return {SearchParameters} new instance\n   */\n  removeExcludeRefinement: function removeExcludeRefinement(facet, value) {\n    if (!this.isConjunctiveFacet(facet)) {\n      throw new Error(\n        facet +\n          ' is not defined in the facets attribute of the helper configuration'\n      );\n    }\n    if (!RefinementList.isRefined(this.facetsExcludes, facet, value))\n      return this;\n\n    return this.setQueryParameters({\n      facetsExcludes: RefinementList.removeRefinement(\n        this.facetsExcludes,\n        facet,\n        value\n      ),\n    });\n  },\n  /**\n   * Remove a refinement on a disjunctive facet\n   * @method\n   * @param {string} facet name of the attribute used for faceting\n   * @param {string} value value used to filter\n   * @return {SearchParameters} new instance\n   */\n  removeDisjunctiveFacetRefinement: function removeDisjunctiveFacetRefinement(\n    facet,\n    value\n  ) {\n    if (!this.isDisjunctiveFacet(facet)) {\n      throw new Error(\n        facet +\n          ' is not defined in the disjunctiveFacets attribute of the helper configuration'\n      );\n    }\n    if (\n      !RefinementList.isRefined(this.disjunctiveFacetsRefinements, facet, value)\n    )\n      return this;\n\n    return this.setQueryParameters({\n      disjunctiveFacetsRefinements: RefinementList.removeRefinement(\n        this.disjunctiveFacetsRefinements,\n        facet,\n        value\n      ),\n    });\n  },\n  /**\n   * Remove a tag from the list of tag refinements\n   * @method\n   * @param {string} tag the tag to remove\n   * @return {SearchParameters} new instance\n   */\n  removeTagRefinement: function removeTagRefinement(tag) {\n    if (!this.isTagRefined(tag)) return this;\n\n    var modification = {\n      tagRefinements: this.tagRefinements.filter(function (t) {\n        return t !== tag;\n      }),\n    };\n\n    return this.setQueryParameters(modification);\n  },\n  /**\n   * Generic toggle refinement method to use with facet, disjunctive facets\n   * and hierarchical facets\n   * @param  {string} facet the facet to refine\n   * @param  {string} value the associated value\n   * @return {SearchParameters} new instance\n   * @throws will throw an error if the facet is not declared in the settings of the helper\n   * @deprecated since version 2.19.0, see {@link SearchParameters#toggleFacetRefinement}\n   */\n  toggleRefinement: function toggleRefinement(facet, value) {\n    return this.toggleFacetRefinement(facet, value);\n  },\n  /**\n   * Generic toggle refinement method to use with facet, disjunctive facets\n   * and hierarchical facets\n   * @param  {string} facet the facet to refine\n   * @param  {string} value the associated value\n   * @return {SearchParameters} new instance\n   * @throws will throw an error if the facet is not declared in the settings of the helper\n   */\n  toggleFacetRefinement: function toggleFacetRefinement(facet, value) {\n    if (this.isHierarchicalFacet(facet)) {\n      return this.toggleHierarchicalFacetRefinement(facet, value);\n    } else if (this.isConjunctiveFacet(facet)) {\n      return this.toggleConjunctiveFacetRefinement(facet, value);\n    } else if (this.isDisjunctiveFacet(facet)) {\n      return this.toggleDisjunctiveFacetRefinement(facet, value);\n    }\n\n    throw new Error(\n      'Cannot refine the undeclared facet ' +\n        facet +\n        '; it should be added to the helper options facets, disjunctiveFacets or hierarchicalFacets'\n    );\n  },\n  /**\n   * Switch the refinement applied over a facet/value\n   * @method\n   * @param {string} facet name of the attribute used for faceting\n   * @param {value} value value used for filtering\n   * @return {SearchParameters} new instance\n   */\n  toggleConjunctiveFacetRefinement: function toggleConjunctiveFacetRefinement(\n    facet,\n    value\n  ) {\n    if (!this.isConjunctiveFacet(facet)) {\n      throw new Error(\n        facet +\n          ' is not defined in the facets attribute of the helper configuration'\n      );\n    }\n\n    return this.setQueryParameters({\n      facetsRefinements: RefinementList.toggleRefinement(\n        this.facetsRefinements,\n        facet,\n        value\n      ),\n    });\n  },\n  /**\n   * Switch the refinement applied over a facet/value\n   * @method\n   * @param {string} facet name of the attribute used for faceting\n   * @param {value} value value used for filtering\n   * @return {SearchParameters} new instance\n   */\n  toggleExcludeFacetRefinement: function toggleExcludeFacetRefinement(\n    facet,\n    value\n  ) {\n    if (!this.isConjunctiveFacet(facet)) {\n      throw new Error(\n        facet +\n          ' is not defined in the facets attribute of the helper configuration'\n      );\n    }\n\n    return this.setQueryParameters({\n      facetsExcludes: RefinementList.toggleRefinement(\n        this.facetsExcludes,\n        facet,\n        value\n      ),\n    });\n  },\n  /**\n   * Switch the refinement applied over a facet/value\n   * @method\n   * @param {string} facet name of the attribute used for faceting\n   * @param {value} value value used for filtering\n   * @return {SearchParameters} new instance\n   */\n  toggleDisjunctiveFacetRefinement: function toggleDisjunctiveFacetRefinement(\n    facet,\n    value\n  ) {\n    if (!this.isDisjunctiveFacet(facet)) {\n      throw new Error(\n        facet +\n          ' is not defined in the disjunctiveFacets attribute of the helper configuration'\n      );\n    }\n\n    return this.setQueryParameters({\n      disjunctiveFacetsRefinements: RefinementList.toggleRefinement(\n        this.disjunctiveFacetsRefinements,\n        facet,\n        value\n      ),\n    });\n  },\n  /**\n   * Switch the refinement applied over a facet/value\n   * @method\n   * @param {string} facet name of the attribute used for faceting\n   * @param {value} value value used for filtering\n   * @return {SearchParameters} new instance\n   */\n  toggleHierarchicalFacetRefinement: function toggleHierarchicalFacetRefinement(\n    facet,\n    value\n  ) {\n    if (!this.isHierarchicalFacet(facet)) {\n      throw new Error(\n        facet +\n          ' is not defined in the hierarchicalFacets attribute of the helper configuration'\n      );\n    }\n\n    var separator = this._getHierarchicalFacetSeparator(\n      this.getHierarchicalFacetByName(facet)\n    );\n\n    var mod = {};\n\n    var upOneOrMultipleLevel =\n      this.hierarchicalFacetsRefinements[facet] !== undefined &&\n      this.hierarchicalFacetsRefinements[facet].length > 0 &&\n      // remove current refinement:\n      // refinement was 'beer > IPA', call is toggleRefine('beer > IPA'), refinement should be `beer`\n      (this.hierarchicalFacetsRefinements[facet][0] === value ||\n        // remove a parent refinement of the current refinement:\n        //  - refinement was 'beer > IPA > Flying dog'\n        //  - call is toggleRefine('beer > IPA')\n        //  - refinement should be `beer`\n        this.hierarchicalFacetsRefinements[facet][0].indexOf(\n          value + separator\n        ) === 0);\n\n    if (upOneOrMultipleLevel) {\n      if (value.indexOf(separator) === -1) {\n        // go back to root level\n        mod[facet] = [];\n      } else {\n        mod[facet] = [value.slice(0, value.lastIndexOf(separator))];\n      }\n    } else {\n      mod[facet] = [value];\n    }\n\n    return this.setQueryParameters({\n      hierarchicalFacetsRefinements: defaultsPure(\n        {},\n        mod,\n        this.hierarchicalFacetsRefinements\n      ),\n    });\n  },\n\n  /**\n   * Adds a refinement on a hierarchical facet.\n   * @param {string} facet the facet name\n   * @param {string} path the hierarchical facet path\n   * @return {SearchParameter} the new state\n   * @throws Error if the facet is not defined or if the facet is refined\n   */\n  addHierarchicalFacetRefinement: function (facet, path) {\n    if (this.isHierarchicalFacetRefined(facet)) {\n      throw new Error(facet + ' is already refined.');\n    }\n    if (!this.isHierarchicalFacet(facet)) {\n      throw new Error(\n        facet +\n          ' is not defined in the hierarchicalFacets attribute of the helper configuration.'\n      );\n    }\n    var mod = {};\n    mod[facet] = [path];\n    return this.setQueryParameters({\n      hierarchicalFacetsRefinements: defaultsPure(\n        {},\n        mod,\n        this.hierarchicalFacetsRefinements\n      ),\n    });\n  },\n\n  /**\n   * Removes the refinement set on a hierarchical facet.\n   * @param {string} facet the facet name\n   * @return {SearchParameter} the new state\n   * @throws Error if the facet is not defined or if the facet is not refined\n   */\n  removeHierarchicalFacetRefinement: function (facet) {\n    if (!this.isHierarchicalFacetRefined(facet)) {\n      return this;\n    }\n    var mod = {};\n    mod[facet] = [];\n    return this.setQueryParameters({\n      hierarchicalFacetsRefinements: defaultsPure(\n        {},\n        mod,\n        this.hierarchicalFacetsRefinements\n      ),\n    });\n  },\n  /**\n   * Switch the tag refinement\n   * @method\n   * @param {string} tag the tag to remove or add\n   * @return {SearchParameters} new instance\n   */\n  toggleTagRefinement: function toggleTagRefinement(tag) {\n    if (this.isTagRefined(tag)) {\n      return this.removeTagRefinement(tag);\n    }\n\n    return this.addTagRefinement(tag);\n  },\n  /**\n   * Test if the facet name is from one of the disjunctive facets\n   * @method\n   * @param {string} facet facet name to test\n   * @return {boolean} true if facet is a disjunctive facet\n   */\n  isDisjunctiveFacet: function (facet) {\n    return this.disjunctiveFacets.indexOf(facet) > -1;\n  },\n  /**\n   * Test if the facet name is from one of the hierarchical facets\n   * @method\n   * @param {string} facetName facet name to test\n   * @return {boolean} true if facetName is a hierarchical facet\n   */\n  isHierarchicalFacet: function (facetName) {\n    return this.getHierarchicalFacetByName(facetName) !== undefined;\n  },\n  /**\n   * Test if the facet name is from one of the conjunctive/normal facets\n   * @method\n   * @param {string} facet facet name to test\n   * @return {boolean} true if facet is a conjunctive facet\n   */\n  isConjunctiveFacet: function (facet) {\n    return this.facets.indexOf(facet) > -1;\n  },\n  /**\n   * Returns true if the facet is refined, either for a specific value or in\n   * general.\n   * @method\n   * @param {string} facet name of the attribute for used for faceting\n   * @param {string} value, optional value. If passed will test that this value\n   * is filtering the given facet.\n   * @return {boolean} returns true if refined\n   */\n  isFacetRefined: function isFacetRefined(facet, value) {\n    if (!this.isConjunctiveFacet(facet)) {\n      return false;\n    }\n    return RefinementList.isRefined(this.facetsRefinements, facet, value);\n  },\n  /**\n   * Returns true if the facet contains exclusions or if a specific value is\n   * excluded.\n   *\n   * @method\n   * @param {string} facet name of the attribute for used for faceting\n   * @param {string} [value] optional value. If passed will test that this value\n   * is filtering the given facet.\n   * @return {boolean} returns true if refined\n   */\n  isExcludeRefined: function isExcludeRefined(facet, value) {\n    if (!this.isConjunctiveFacet(facet)) {\n      return false;\n    }\n    return RefinementList.isRefined(this.facetsExcludes, facet, value);\n  },\n  /**\n   * Returns true if the facet contains a refinement, or if a value passed is a\n   * refinement for the facet.\n   * @method\n   * @param {string} facet name of the attribute for used for faceting\n   * @param {string} value optional, will test if the value is used for refinement\n   * if there is one, otherwise will test if the facet contains any refinement\n   * @return {boolean} true if the facet is refined\n   */\n  isDisjunctiveFacetRefined: function isDisjunctiveFacetRefined(facet, value) {\n    if (!this.isDisjunctiveFacet(facet)) {\n      return false;\n    }\n    return RefinementList.isRefined(\n      this.disjunctiveFacetsRefinements,\n      facet,\n      value\n    );\n  },\n  /**\n   * Returns true if the facet contains a refinement, or if a value passed is a\n   * refinement for the facet.\n   * @method\n   * @param {string} facet name of the attribute for used for faceting\n   * @param {string} value optional, will test if the value is used for refinement\n   * if there is one, otherwise will test if the facet contains any refinement\n   * @return {boolean} true if the facet is refined\n   */\n  isHierarchicalFacetRefined: function isHierarchicalFacetRefined(\n    facet,\n    value\n  ) {\n    if (!this.isHierarchicalFacet(facet)) {\n      return false;\n    }\n\n    var refinements = this.getHierarchicalRefinement(facet);\n\n    if (!value) {\n      return refinements.length > 0;\n    }\n\n    return refinements.indexOf(value) !== -1;\n  },\n  /**\n   * Test if the triple (attribute, operator, value) is already refined.\n   * If only the attribute and the operator are provided, it tests if the\n   * contains any refinement value.\n   * @method\n   * @param {string} attribute attribute for which the refinement is applied\n   * @param {string} [operator] operator of the refinement\n   * @param {string} [value] value of the refinement\n   * @return {boolean} true if it is refined\n   */\n  isNumericRefined: function isNumericRefined(attribute, operator, value) {\n    if (value === undefined && operator === undefined) {\n      return Boolean(this.numericRefinements[attribute]);\n    }\n\n    var isOperatorDefined =\n      this.numericRefinements[attribute] &&\n      this.numericRefinements[attribute][operator] !== undefined;\n\n    if (value === undefined || !isOperatorDefined) {\n      return isOperatorDefined;\n    }\n\n    var parsedValue = valToNumber(value);\n    var isAttributeValueDefined =\n      findArray(this.numericRefinements[attribute][operator], parsedValue) !==\n      undefined;\n\n    return isOperatorDefined && isAttributeValueDefined;\n  },\n  /**\n   * Returns true if the tag refined, false otherwise\n   * @method\n   * @param {string} tag the tag to check\n   * @return {boolean} true if tag is refined\n   */\n  isTagRefined: function isTagRefined(tag) {\n    return this.tagRefinements.indexOf(tag) !== -1;\n  },\n  /**\n   * Returns the list of all disjunctive facets refined\n   * @method\n   * @param {string} facet name of the attribute used for faceting\n   * @param {value} value value used for filtering\n   * @return {string[]} returns the list of refinements\n   */\n  getRefinedDisjunctiveFacets: function getRefinedDisjunctiveFacets() {\n    // eslint-disable-next-line consistent-this\n    var self = this;\n\n    // attributes used for numeric filter can also be disjunctive\n    var disjunctiveNumericRefinedFacets = intersection(\n      Object.keys(this.numericRefinements).filter(function (facet) {\n        return Object.keys(self.numericRefinements[facet]).length > 0;\n      }),\n      this.disjunctiveFacets\n    );\n\n    return Object.keys(this.disjunctiveFacetsRefinements)\n      .filter(function (facet) {\n        return self.disjunctiveFacetsRefinements[facet].length > 0;\n      })\n      .concat(disjunctiveNumericRefinedFacets)\n      .concat(this.getRefinedHierarchicalFacets())\n      .sort();\n  },\n  /**\n   * Returns the list of all disjunctive facets refined\n   * @method\n   * @param {string} facet name of the attribute used for faceting\n   * @param {value} value value used for filtering\n   * @return {string[]} returns the list of refinements\n   */\n  getRefinedHierarchicalFacets: function getRefinedHierarchicalFacets() {\n    // eslint-disable-next-line consistent-this\n    var self = this;\n    return intersection(\n      // enforce the order between the two arrays,\n      // so that refinement name index === hierarchical facet index\n      this.hierarchicalFacets.map(function (facet) {\n        return facet.name;\n      }),\n      Object.keys(this.hierarchicalFacetsRefinements).filter(function (facet) {\n        return self.hierarchicalFacetsRefinements[facet].length > 0;\n      })\n    ).sort();\n  },\n  /**\n   * Returned the list of all disjunctive facets not refined\n   * @method\n   * @return {string[]} returns the list of facets that are not refined\n   */\n  getUnrefinedDisjunctiveFacets: function () {\n    var refinedFacets = this.getRefinedDisjunctiveFacets();\n\n    return this.disjunctiveFacets.filter(function (f) {\n      return refinedFacets.indexOf(f) === -1;\n    });\n  },\n\n  managedParameters: [\n    'index',\n\n    'facets',\n    'disjunctiveFacets',\n    'facetsRefinements',\n    'hierarchicalFacets',\n    'facetsExcludes',\n\n    'disjunctiveFacetsRefinements',\n    'numericRefinements',\n    'tagRefinements',\n    'hierarchicalFacetsRefinements',\n  ],\n\n  getQueryParams: function getQueryParams() {\n    var managedParameters = this.managedParameters;\n\n    var queryParams = {};\n\n    // eslint-disable-next-line consistent-this\n    var self = this;\n    Object.keys(this).forEach(function (paramName) {\n      var paramValue = self[paramName];\n      if (\n        managedParameters.indexOf(paramName) === -1 &&\n        paramValue !== undefined\n      ) {\n        queryParams[paramName] = paramValue;\n      }\n    });\n\n    return queryParams;\n  },\n  /**\n   * Let the user set a specific value for a given parameter. Will return the\n   * same instance if the parameter is invalid or if the value is the same as the\n   * previous one.\n   * @method\n   * @param {string} parameter the parameter name\n   * @param {any} value the value to be set, must be compliant with the definition\n   * of the attribute on the object\n   * @return {SearchParameters} the updated state\n   */\n  setQueryParameter: function setParameter(parameter, value) {\n    if (this[parameter] === value) return this;\n\n    var modification = {};\n\n    modification[parameter] = value;\n\n    return this.setQueryParameters(modification);\n  },\n  /**\n   * Let the user set any of the parameters with a plain object.\n   * @method\n   * @param {object} params all the keys and the values to be updated\n   * @return {SearchParameters} a new updated instance\n   */\n  setQueryParameters: function setQueryParameters(params) {\n    if (!params) return this;\n\n    var error = SearchParameters.validate(this, params);\n\n    if (error) {\n      throw error;\n    }\n\n    // eslint-disable-next-line consistent-this\n    var self = this;\n    var nextWithNumbers = SearchParameters._parseNumbers(params);\n    var previousPlainObject = Object.keys(this).reduce(function (acc, key) {\n      acc[key] = self[key];\n      return acc;\n    }, {});\n\n    var nextPlainObject = Object.keys(nextWithNumbers).reduce(function (\n      previous,\n      key\n    ) {\n      var isPreviousValueDefined = previous[key] !== undefined;\n      var isNextValueDefined = nextWithNumbers[key] !== undefined;\n\n      if (isPreviousValueDefined && !isNextValueDefined) {\n        return omit(previous, [key]);\n      }\n\n      if (isNextValueDefined) {\n        previous[key] = nextWithNumbers[key];\n      }\n\n      return previous;\n    },\n    previousPlainObject);\n\n    return new this.constructor(nextPlainObject);\n  },\n\n  /**\n   * Returns a new instance with the page reset. Two scenarios possible:\n   * the page is omitted -> return the given instance\n   * the page is set -> return a new instance with a page of 0\n   * @return {SearchParameters} a new updated instance\n   */\n  resetPage: function () {\n    if (this.page === undefined) {\n      return this;\n    }\n\n    return this.setPage(0);\n  },\n\n  /**\n   * Helper function to get the hierarchicalFacet separator or the default one (`>`)\n   * @param  {object} hierarchicalFacet the hierarchicalFacet object\n   * @return {string} returns the hierarchicalFacet.separator or `>` as default\n   */\n  _getHierarchicalFacetSortBy: function (hierarchicalFacet) {\n    return hierarchicalFacet.sortBy || ['isRefined:desc', 'name:asc'];\n  },\n\n  /**\n   * Helper function to get the hierarchicalFacet separator or the default one (`>`)\n   * @private\n   * @param  {object} hierarchicalFacet the hierarchicalFacet object\n   * @return {string} returns the hierarchicalFacet.separator or `>` as default\n   */\n  _getHierarchicalFacetSeparator: function (hierarchicalFacet) {\n    return hierarchicalFacet.separator || ' > ';\n  },\n\n  /**\n   * Helper function to get the hierarchicalFacet prefix path or null\n   * @private\n   * @param  {object} hierarchicalFacet the hierarchicalFacet object\n   * @return {string} returns the hierarchicalFacet.rootPath or null as default\n   */\n  _getHierarchicalRootPath: function (hierarchicalFacet) {\n    return hierarchicalFacet.rootPath || null;\n  },\n\n  /**\n   * Helper function to check if we show the parent level of the hierarchicalFacet\n   * @private\n   * @param  {object} hierarchicalFacet the hierarchicalFacet object\n   * @return {string} returns the hierarchicalFacet.showParentLevel or true as default\n   */\n  _getHierarchicalShowParentLevel: function (hierarchicalFacet) {\n    if (typeof hierarchicalFacet.showParentLevel === 'boolean') {\n      return hierarchicalFacet.showParentLevel;\n    }\n    return true;\n  },\n\n  /**\n   * Helper function to get the hierarchicalFacet by it's name\n   * @param  {string} hierarchicalFacetName the hierarchicalFacet name\n   * @return {object} a hierarchicalFacet\n   */\n  getHierarchicalFacetByName: function (hierarchicalFacetName) {\n    return find(this.hierarchicalFacets, function (f) {\n      return f.name === hierarchicalFacetName;\n    });\n  },\n\n  /**\n   * Get the current breadcrumb for a hierarchical facet, as an array\n   * @param  {string} facetName Hierarchical facet name\n   * @return {array.<string>} the path as an array of string\n   */\n  getHierarchicalFacetBreadcrumb: function (facetName) {\n    if (!this.isHierarchicalFacet(facetName)) {\n      return [];\n    }\n\n    var refinement = this.getHierarchicalRefinement(facetName)[0];\n    if (!refinement) return [];\n\n    var separator = this._getHierarchicalFacetSeparator(\n      this.getHierarchicalFacetByName(facetName)\n    );\n    var path = refinement.split(separator);\n    return path.map(function (part) {\n      return part.trim();\n    });\n  },\n\n  toString: function () {\n    return JSON.stringify(this, null, 2);\n  },\n};\n\n/**\n * Callback used for clearRefinement method\n * @callback SearchParameters.clearCallback\n * @param {OperatorList|FacetList} value the value of the filter\n * @param {string} key the current attribute name\n * @param {string} type `numeric`, `disjunctiveFacet`, `conjunctiveFacet`, `hierarchicalFacet` or `exclude`\n * depending on the type of facet\n * @return {boolean} `true` if the element should be removed. `false` otherwise.\n */\nmodule.exports = SearchParameters;\n","'use strict';\n\nmodule.exports = generateTrees;\n\nvar fv = require('../functions/escapeFacetValue');\nvar find = require('../functions/find');\nvar prepareHierarchicalFacetSortBy = require('../functions/formatSort');\nvar orderBy = require('../functions/orderBy');\nvar escapeFacetValue = fv.escapeFacetValue;\nvar unescapeFacetValue = fv.unescapeFacetValue;\n\nfunction generateTrees(state) {\n  return function generate(hierarchicalFacetResult, hierarchicalFacetIndex) {\n    var hierarchicalFacet = state.hierarchicalFacets[hierarchicalFacetIndex];\n    var hierarchicalFacetRefinement =\n      (state.hierarchicalFacetsRefinements[hierarchicalFacet.name] &&\n        state.hierarchicalFacetsRefinements[hierarchicalFacet.name][0]) ||\n      '';\n    var hierarchicalSeparator =\n      state._getHierarchicalFacetSeparator(hierarchicalFacet);\n    var hierarchicalRootPath =\n      state._getHierarchicalRootPath(hierarchicalFacet);\n    var hierarchicalShowParentLevel =\n      state._getHierarchicalShowParentLevel(hierarchicalFacet);\n    var sortBy = prepareHierarchicalFacetSortBy(\n      state._getHierarchicalFacetSortBy(hierarchicalFacet)\n    );\n\n    var rootExhaustive = hierarchicalFacetResult.every(function (facetResult) {\n      return facetResult.exhaustive;\n    });\n\n    var generateTreeFn = generateHierarchicalTree(\n      sortBy,\n      hierarchicalSeparator,\n      hierarchicalRootPath,\n      hierarchicalShowParentLevel,\n      hierarchicalFacetRefinement\n    );\n\n    var results = hierarchicalFacetResult;\n\n    if (hierarchicalRootPath) {\n      results = hierarchicalFacetResult.slice(\n        hierarchicalRootPath.split(hierarchicalSeparator).length\n      );\n    }\n\n    return results.reduce(generateTreeFn, {\n      name: state.hierarchicalFacets[hierarchicalFacetIndex].name,\n      count: null, // root level, no count\n      isRefined: true, // root level, always refined\n      path: null, // root level, no path\n      escapedValue: null,\n      exhaustive: rootExhaustive,\n      data: null,\n    });\n  };\n}\n\nfunction generateHierarchicalTree(\n  sortBy,\n  hierarchicalSeparator,\n  hierarchicalRootPath,\n  hierarchicalShowParentLevel,\n  currentRefinement\n) {\n  return function generateTree(\n    hierarchicalTree,\n    hierarchicalFacetResult,\n    currentHierarchicalLevel\n  ) {\n    var parent = hierarchicalTree;\n\n    if (currentHierarchicalLevel > 0) {\n      var level = 0;\n\n      parent = hierarchicalTree;\n\n      while (level < currentHierarchicalLevel) {\n        /**\n         * @type {object[]]} hierarchical data\n         */\n        var data = parent && Array.isArray(parent.data) ? parent.data : [];\n        parent = find(data, function (subtree) {\n          return subtree.isRefined;\n        });\n        level++;\n      }\n    }\n\n    // we found a refined parent, let's add current level data under it\n    if (parent) {\n      // filter values in case an object has multiple categories:\n      //   {\n      //     categories: {\n      //       level0: ['beers', 'bières'],\n      //       level1: ['beers > IPA', 'bières > Belges']\n      //     }\n      //   }\n      //\n      // If parent refinement is `beers`, then we do not want to have `bières > Belges`\n      // showing up\n\n      var picked = Object.keys(hierarchicalFacetResult.data)\n        .map(function (facetValue) {\n          return [facetValue, hierarchicalFacetResult.data[facetValue]];\n        })\n        .filter(function (tuple) {\n          var facetValue = tuple[0];\n          return onlyMatchingTree(\n            facetValue,\n            parent.path || hierarchicalRootPath,\n            currentRefinement,\n            hierarchicalSeparator,\n            hierarchicalRootPath,\n            hierarchicalShowParentLevel\n          );\n        });\n\n      parent.data = orderBy(\n        picked.map(function (tuple) {\n          var facetValue = tuple[0];\n          var facetCount = tuple[1];\n\n          return format(\n            facetCount,\n            facetValue,\n            hierarchicalSeparator,\n            unescapeFacetValue(currentRefinement),\n            hierarchicalFacetResult.exhaustive\n          );\n        }),\n        sortBy[0],\n        sortBy[1]\n      );\n    }\n\n    return hierarchicalTree;\n  };\n}\n\n// eslint-disable-next-line max-params\nfunction onlyMatchingTree(\n  facetValue,\n  parentPath,\n  currentRefinement,\n  hierarchicalSeparator,\n  hierarchicalRootPath,\n  hierarchicalShowParentLevel\n) {\n  // we want the facetValue is a child of hierarchicalRootPath\n  if (\n    hierarchicalRootPath &&\n    (facetValue.indexOf(hierarchicalRootPath) !== 0 ||\n      hierarchicalRootPath === facetValue)\n  ) {\n    return false;\n  }\n\n  // we always want root levels (only when there is no prefix path)\n  return (\n    (!hierarchicalRootPath &&\n      facetValue.indexOf(hierarchicalSeparator) === -1) ||\n    // if there is a rootPath, being root level mean 1 level under rootPath\n    (hierarchicalRootPath &&\n      facetValue.split(hierarchicalSeparator).length -\n        hierarchicalRootPath.split(hierarchicalSeparator).length ===\n        1) ||\n    // if current refinement is a root level and current facetValue is a root level,\n    // keep the facetValue\n    (facetValue.indexOf(hierarchicalSeparator) === -1 &&\n      currentRefinement.indexOf(hierarchicalSeparator) === -1) ||\n    // currentRefinement is a child of the facet value\n    currentRefinement.indexOf(facetValue) === 0 ||\n    // facetValue is a child of the current parent, add it\n    (facetValue.indexOf(parentPath + hierarchicalSeparator) === 0 &&\n      (hierarchicalShowParentLevel ||\n        facetValue.indexOf(currentRefinement) === 0))\n  );\n}\n\nfunction format(\n  facetCount,\n  facetValue,\n  hierarchicalSeparator,\n  currentRefinement,\n  exhaustive\n) {\n  var parts = facetValue.split(hierarchicalSeparator);\n  return {\n    name: parts[parts.length - 1].trim(),\n    path: facetValue,\n    escapedValue: escapeFacetValue(facetValue),\n    count: facetCount,\n    isRefined:\n      currentRefinement === facetValue ||\n      currentRefinement.indexOf(facetValue + hierarchicalSeparator) === 0,\n    exhaustive: exhaustive,\n    data: null,\n  };\n}\n","'use strict';\n\nvar compact = require('../functions/compact');\nvar defaultsPure = require('../functions/defaultsPure');\nvar fv = require('../functions/escapeFacetValue');\nvar find = require('../functions/find');\nvar findIndex = require('../functions/findIndex');\nvar formatSort = require('../functions/formatSort');\nvar merge = require('../functions/merge');\nvar orderBy = require('../functions/orderBy');\nvar escapeFacetValue = fv.escapeFacetValue;\nvar unescapeFacetValue = fv.unescapeFacetValue;\n\nvar generateHierarchicalTree = require('./generate-hierarchical-tree');\n\n/**\n * @typedef SearchResults.Facet\n * @type {object}\n * @property {string} name name of the attribute in the record\n * @property {object} data the faceting data: value, number of entries\n * @property {object} stats undefined unless facet_stats is retrieved from algolia\n */\n\n/**\n * @typedef SearchResults.HierarchicalFacet\n * @type {object}\n * @property {string} name name of the current value given the hierarchical level, trimmed.\n * If root node, you get the facet name\n * @property {number} count number of objects matching this hierarchical value\n * @property {string} path the current hierarchical value full path\n * @property {boolean} isRefined `true` if the current value was refined, `false` otherwise\n * @property {HierarchicalFacet[]} data sub values for the current level\n */\n\n/**\n * @typedef SearchResults.FacetValue\n * @type {object}\n * @property {string} name the facet value itself\n * @property {number} count times this facet appears in the results\n * @property {boolean} isRefined is the facet currently selected\n * @property {boolean} isExcluded is the facet currently excluded (only for conjunctive facets)\n */\n\n/**\n * @typedef Refinement\n * @type {object}\n * @property {string} type the type of filter used:\n * `numeric`, `facet`, `exclude`, `disjunctive`, `hierarchical`\n * @property {string} attributeName name of the attribute used for filtering\n * @property {string} name the value of the filter\n * @property {number} numericValue the value as a number. Only for numeric filters.\n * @property {string} operator the operator used. Only for numeric filters.\n * @property {number} count the number of computed hits for this filter. Only on facets.\n * @property {boolean} exhaustive if the count is exhaustive\n */\n\n/**\n * Turn an array of attributes in an object of attributes with their position in the array as value\n * @param {string[]} attributes the list of attributes in the record\n * @return {object} the list of attributes indexed by attribute name\n */\nfunction getIndices(attributes) {\n  var indices = {};\n\n  attributes.forEach(function (val, idx) {\n    indices[val] = idx;\n  });\n\n  return indices;\n}\n\nfunction assignFacetStats(dest, facetStats, key) {\n  if (facetStats && facetStats[key]) {\n    dest.stats = facetStats[key];\n  }\n}\n\n/**\n * @typedef {Object} HierarchicalFacet\n * @property {string} name\n * @property {string[]} attributes\n */\n\n/**\n * @param {HierarchicalFacet[]} hierarchicalFacets All hierarchical facets\n * @param {string} hierarchicalAttributeName The name of the hierarchical attribute\n * @return {HierarchicalFacet} The hierarchical facet matching the attribute name\n */\nfunction findMatchingHierarchicalFacetFromAttributeName(\n  hierarchicalFacets,\n  hierarchicalAttributeName\n) {\n  return find(\n    hierarchicalFacets,\n    function facetKeyMatchesAttribute(hierarchicalFacet) {\n      var facetNames = hierarchicalFacet.attributes || [];\n      return facetNames.indexOf(hierarchicalAttributeName) > -1;\n    }\n  );\n}\n\n// eslint-disable-next-line valid-jsdoc\n/**\n * Constructor for SearchResults\n * @class\n * @classdesc SearchResults contains the results of a query to Algolia using the\n * {@link AlgoliaSearchHelper}.\n * @param {SearchParameters} state state that led to the response\n * @param {array.<object>} results the results from algolia client\n * @example <caption>SearchResults of the first query in\n * <a href=\"http://demos.algolia.com/instant-search-demo\">the instant search demo</a></caption>\n{\n   \"hitsPerPage\": 10,\n   \"processingTimeMS\": 2,\n   \"facets\": [\n      {\n         \"name\": \"type\",\n         \"data\": {\n            \"HardGood\": 6627,\n            \"BlackTie\": 550,\n            \"Music\": 665,\n            \"Software\": 131,\n            \"Game\": 456,\n            \"Movie\": 1571\n         },\n         \"exhaustive\": false\n      },\n      {\n         \"exhaustive\": false,\n         \"data\": {\n            \"Free shipping\": 5507\n         },\n         \"name\": \"shipping\"\n      }\n  ],\n   \"hits\": [\n      {\n         \"thumbnailImage\": \"http://img.bbystatic.com/BestBuy_US/images/products/1688/1688832_54x108_s.gif\",\n         \"_highlightResult\": {\n            \"shortDescription\": {\n               \"matchLevel\": \"none\",\n               \"value\": \"Safeguard your PC, Mac, Android and iOS devices with comprehensive Internet protection\",\n               \"matchedWords\": []\n            },\n            \"category\": {\n               \"matchLevel\": \"none\",\n               \"value\": \"Computer Security Software\",\n               \"matchedWords\": []\n            },\n            \"manufacturer\": {\n               \"matchedWords\": [],\n               \"value\": \"Webroot\",\n               \"matchLevel\": \"none\"\n            },\n            \"name\": {\n               \"value\": \"Webroot SecureAnywhere Internet Security (3-Device) (1-Year Subscription) - Mac/Windows\",\n               \"matchedWords\": [],\n               \"matchLevel\": \"none\"\n            }\n         },\n         \"image\": \"http://img.bbystatic.com/BestBuy_US/images/products/1688/1688832_105x210_sc.jpg\",\n         \"shipping\": \"Free shipping\",\n         \"bestSellingRank\": 4,\n         \"shortDescription\": \"Safeguard your PC, Mac, Android and iOS devices with comprehensive Internet protection\",\n         \"url\": \"http://www.bestbuy.com/site/webroot-secureanywhere-internet-security-3-devi…d=1219060687969&skuId=1688832&cmp=RMX&ky=2d3GfEmNIzjA0vkzveHdZEBgpPCyMnLTJ\",\n         \"name\": \"Webroot SecureAnywhere Internet Security (3-Device) (1-Year Subscription) - Mac/Windows\",\n         \"category\": \"Computer Security Software\",\n         \"salePrice_range\": \"1 - 50\",\n         \"objectID\": \"1688832\",\n         \"type\": \"Software\",\n         \"customerReviewCount\": 5980,\n         \"salePrice\": 49.99,\n         \"manufacturer\": \"Webroot\"\n      },\n      ....\n  ],\n   \"nbHits\": 10000,\n   \"disjunctiveFacets\": [\n      {\n         \"exhaustive\": false,\n         \"data\": {\n            \"5\": 183,\n            \"12\": 112,\n            \"7\": 149,\n            ...\n         },\n         \"name\": \"customerReviewCount\",\n         \"stats\": {\n            \"max\": 7461,\n            \"avg\": 157.939,\n            \"min\": 1\n         }\n      },\n      {\n         \"data\": {\n            \"Printer Ink\": 142,\n            \"Wireless Speakers\": 60,\n            \"Point & Shoot Cameras\": 48,\n            ...\n         },\n         \"name\": \"category\",\n         \"exhaustive\": false\n      },\n      {\n         \"exhaustive\": false,\n         \"data\": {\n            \"> 5000\": 2,\n            \"1 - 50\": 6524,\n            \"501 - 2000\": 566,\n            \"201 - 500\": 1501,\n            \"101 - 200\": 1360,\n            \"2001 - 5000\": 47\n         },\n         \"name\": \"salePrice_range\"\n      },\n      {\n         \"data\": {\n            \"Dynex™\": 202,\n            \"Insignia™\": 230,\n            \"PNY\": 72,\n            ...\n         },\n         \"name\": \"manufacturer\",\n         \"exhaustive\": false\n      }\n  ],\n   \"query\": \"\",\n   \"nbPages\": 100,\n   \"page\": 0,\n   \"index\": \"bestbuy\"\n}\n **/\nfunction SearchResults(state, results, options) {\n  var mainSubResponse = results[0];\n\n  this._rawResults = results;\n\n  // eslint-disable-next-line consistent-this\n  var self = this;\n\n  // https://www.algolia.com/doc/api-reference/api-methods/search/#response\n  Object.keys(mainSubResponse).forEach(function (key) {\n    self[key] = mainSubResponse[key];\n  });\n\n  // Make every key of the result options reachable from the instance\n  Object.keys(options || {}).forEach(function (key) {\n    self[key] = options[key];\n  });\n\n  /**\n   * query used to generate the results\n   * @name query\n   * @member {string}\n   * @memberof SearchResults\n   * @instance\n   */\n  /**\n   * The query as parsed by the engine given all the rules.\n   * @name parsedQuery\n   * @member {string}\n   * @memberof SearchResults\n   * @instance\n   */\n  /**\n   * all the records that match the search parameters. Each record is\n   * augmented with a new attribute `_highlightResult`\n   * which is an object keyed by attribute and with the following properties:\n   * - `value` : the value of the facet highlighted (html)\n   * - `matchLevel`: `full`, `partial` or `none`, depending on how the query terms match\n   * @name hits\n   * @member {object[]}\n   * @memberof SearchResults\n   * @instance\n   */\n  /**\n   * index where the results come from\n   * @name index\n   * @member {string}\n   * @memberof SearchResults\n   * @instance\n   */\n  /**\n   * number of hits per page requested\n   * @name hitsPerPage\n   * @member {number}\n   * @memberof SearchResults\n   * @instance\n   */\n  /**\n   * total number of hits of this query on the index\n   * @name nbHits\n   * @member {number}\n   * @memberof SearchResults\n   * @instance\n   */\n  /**\n   * total number of pages with respect to the number of hits per page and the total number of hits\n   * @name nbPages\n   * @member {number}\n   * @memberof SearchResults\n   * @instance\n   */\n  /**\n   * current page\n   * @name page\n   * @member {number}\n   * @memberof SearchResults\n   * @instance\n   */\n  /**\n   * The position if the position was guessed by IP.\n   * @name aroundLatLng\n   * @member {string}\n   * @memberof SearchResults\n   * @instance\n   * @example \"48.8637,2.3615\",\n   */\n  /**\n   * The radius computed by Algolia.\n   * @name automaticRadius\n   * @member {string}\n   * @memberof SearchResults\n   * @instance\n   * @example \"126792922\",\n   */\n  /**\n   * String identifying the server used to serve this request.\n   *\n   * getRankingInfo needs to be set to `true` for this to be returned\n   *\n   * @name serverUsed\n   * @member {string}\n   * @memberof SearchResults\n   * @instance\n   * @example \"c7-use-2.algolia.net\",\n   */\n  /**\n   * Boolean that indicates if the computation of the counts did time out.\n   * @deprecated\n   * @name timeoutCounts\n   * @member {boolean}\n   * @memberof SearchResults\n   * @instance\n   */\n  /**\n   * Boolean that indicates if the computation of the hits did time out.\n   * @deprecated\n   * @name timeoutHits\n   * @member {boolean}\n   * @memberof SearchResults\n   * @instance\n   */\n  /**\n   * True if the counts of the facets is exhaustive\n   * @name exhaustiveFacetsCount\n   * @member {boolean}\n   * @memberof SearchResults\n   * @instance\n   */\n  /**\n   * True if the number of hits is exhaustive\n   * @name exhaustiveNbHits\n   * @member {boolean}\n   * @memberof SearchResults\n   * @instance\n   */\n  /**\n   * Contains the userData if they are set by a [query rule](https://www.algolia.com/doc/guides/query-rules/query-rules-overview/).\n   * @name userData\n   * @member {object[]}\n   * @memberof SearchResults\n   * @instance\n   */\n  /**\n   * queryID is the unique identifier of the query used to generate the current search results.\n   * This value is only available if the `clickAnalytics` search parameter is set to `true`.\n   * @name queryID\n   * @member {string}\n   * @memberof SearchResults\n   * @instance\n   */\n\n  /**\n   * sum of the processing time of all the queries\n   * @name processingTimeMS\n   * @member {number}\n   * @memberof SearchResults\n   * @instance\n   */\n  this.processingTimeMS = results.reduce(function (sum, result) {\n    return result.processingTimeMS === undefined\n      ? sum\n      : sum + result.processingTimeMS;\n  }, 0);\n\n  /**\n   * disjunctive facets results\n   * @member {SearchResults.Facet[]}\n   */\n  this.disjunctiveFacets = [];\n  /**\n   * disjunctive facets results\n   * @member {SearchResults.HierarchicalFacet[]}\n   */\n  this.hierarchicalFacets = state.hierarchicalFacets.map(\n    function initFutureTree() {\n      return [];\n    }\n  );\n  /**\n   * other facets results\n   * @member {SearchResults.Facet[]}\n   */\n  this.facets = [];\n\n  var disjunctiveFacets = state.getRefinedDisjunctiveFacets();\n\n  var facetsIndices = getIndices(state.facets);\n  var disjunctiveFacetsIndices = getIndices(state.disjunctiveFacets);\n  var nextDisjunctiveResult = 1;\n\n  // Since we send request only for disjunctive facets that have been refined,\n  // we get the facets information from the first, general, response.\n\n  var mainFacets = mainSubResponse.facets || {};\n\n  Object.keys(mainFacets).forEach(function (facetKey) {\n    var facetValueObject = mainFacets[facetKey];\n\n    var hierarchicalFacet = findMatchingHierarchicalFacetFromAttributeName(\n      state.hierarchicalFacets,\n      facetKey\n    );\n\n    if (hierarchicalFacet) {\n      // Place the hierarchicalFacet data at the correct index depending on\n      // the attributes order that was defined at the helper initialization\n      var facetIndex = hierarchicalFacet.attributes.indexOf(facetKey);\n      var idxAttributeName = findIndex(state.hierarchicalFacets, function (f) {\n        return f.name === hierarchicalFacet.name;\n      });\n      self.hierarchicalFacets[idxAttributeName][facetIndex] = {\n        attribute: facetKey,\n        data: facetValueObject,\n        exhaustive: mainSubResponse.exhaustiveFacetsCount,\n      };\n    } else {\n      var isFacetDisjunctive = state.disjunctiveFacets.indexOf(facetKey) !== -1;\n      var isFacetConjunctive = state.facets.indexOf(facetKey) !== -1;\n      var position;\n\n      if (isFacetDisjunctive) {\n        position = disjunctiveFacetsIndices[facetKey];\n        self.disjunctiveFacets[position] = {\n          name: facetKey,\n          data: facetValueObject,\n          exhaustive: mainSubResponse.exhaustiveFacetsCount,\n        };\n        assignFacetStats(\n          self.disjunctiveFacets[position],\n          mainSubResponse.facets_stats,\n          facetKey\n        );\n      }\n      if (isFacetConjunctive) {\n        position = facetsIndices[facetKey];\n        self.facets[position] = {\n          name: facetKey,\n          data: facetValueObject,\n          exhaustive: mainSubResponse.exhaustiveFacetsCount,\n        };\n        assignFacetStats(\n          self.facets[position],\n          mainSubResponse.facets_stats,\n          facetKey\n        );\n      }\n    }\n  });\n\n  // Make sure we do not keep holes within the hierarchical facets\n  this.hierarchicalFacets = compact(this.hierarchicalFacets);\n\n  // aggregate the refined disjunctive facets\n  disjunctiveFacets.forEach(function (disjunctiveFacet) {\n    var result = results[nextDisjunctiveResult];\n    var facets = result && result.facets ? result.facets : {};\n    var hierarchicalFacet = state.getHierarchicalFacetByName(disjunctiveFacet);\n\n    // There should be only item in facets.\n    Object.keys(facets).forEach(function (dfacet) {\n      var facetResults = facets[dfacet];\n\n      var position;\n\n      if (hierarchicalFacet) {\n        position = findIndex(state.hierarchicalFacets, function (f) {\n          return f.name === hierarchicalFacet.name;\n        });\n        var attributeIndex = findIndex(\n          self.hierarchicalFacets[position],\n          function (f) {\n            return f.attribute === dfacet;\n          }\n        );\n\n        // previous refinements and no results so not able to find it\n        if (attributeIndex === -1) {\n          return;\n        }\n\n        self.hierarchicalFacets[position][attributeIndex].data = merge(\n          {},\n          self.hierarchicalFacets[position][attributeIndex].data,\n          facetResults\n        );\n      } else {\n        position = disjunctiveFacetsIndices[dfacet];\n\n        var dataFromMainRequest =\n          (mainSubResponse.facets && mainSubResponse.facets[dfacet]) || {};\n\n        self.disjunctiveFacets[position] = {\n          name: dfacet,\n          data: defaultsPure({}, facetResults, dataFromMainRequest),\n          exhaustive: result.exhaustiveFacetsCount,\n        };\n        assignFacetStats(\n          self.disjunctiveFacets[position],\n          result.facets_stats,\n          dfacet\n        );\n\n        if (state.disjunctiveFacetsRefinements[dfacet]) {\n          state.disjunctiveFacetsRefinements[dfacet].forEach(function (\n            refinementValue\n          ) {\n            // add the disjunctive refinements if it is no more retrieved\n            if (\n              !self.disjunctiveFacets[position].data[refinementValue] &&\n              state.disjunctiveFacetsRefinements[dfacet].indexOf(\n                unescapeFacetValue(refinementValue)\n              ) > -1\n            ) {\n              self.disjunctiveFacets[position].data[refinementValue] = 0;\n            }\n          });\n        }\n      }\n    });\n    nextDisjunctiveResult++;\n  });\n\n  // if we have some parent level values for hierarchical facets, merge them\n  state.getRefinedHierarchicalFacets().forEach(function (refinedFacet) {\n    var hierarchicalFacet = state.getHierarchicalFacetByName(refinedFacet);\n    var separator = state._getHierarchicalFacetSeparator(hierarchicalFacet);\n\n    var currentRefinement = state.getHierarchicalRefinement(refinedFacet);\n    // if we are already at a root refinement (or no refinement at all), there is no\n    // root level values request\n    if (\n      currentRefinement.length === 0 ||\n      currentRefinement[0].split(separator).length < 2\n    ) {\n      return;\n    }\n\n    results.slice(nextDisjunctiveResult).forEach(function (result) {\n      var facets = result && result.facets ? result.facets : {};\n\n      Object.keys(facets).forEach(function (dfacet) {\n        var facetResults = facets[dfacet];\n        var position = findIndex(state.hierarchicalFacets, function (f) {\n          return f.name === hierarchicalFacet.name;\n        });\n        var attributeIndex = findIndex(\n          self.hierarchicalFacets[position],\n          function (f) {\n            return f.attribute === dfacet;\n          }\n        );\n\n        // previous refinements and no results so not able to find it\n        if (attributeIndex === -1) {\n          return;\n        }\n\n        // when we always get root levels, if the hits refinement is `beers > IPA` (count: 5),\n        // then the disjunctive values will be `beers` (count: 100),\n        // but we do not want to display\n        //   | beers (100)\n        //     > IPA (5)\n        // We want\n        //   | beers (5)\n        //     > IPA (5)\n        var defaultData = {};\n\n        if (currentRefinement.length > 0) {\n          var root = currentRefinement[0].split(separator)[0];\n          defaultData[root] =\n            self.hierarchicalFacets[position][attributeIndex].data[root];\n        }\n\n        self.hierarchicalFacets[position][attributeIndex].data = defaultsPure(\n          defaultData,\n          facetResults,\n          self.hierarchicalFacets[position][attributeIndex].data\n        );\n      });\n\n      nextDisjunctiveResult++;\n    });\n  });\n\n  // add the excludes\n  Object.keys(state.facetsExcludes).forEach(function (facetName) {\n    var excludes = state.facetsExcludes[facetName];\n    var position = facetsIndices[facetName];\n\n    self.facets[position] = {\n      name: facetName,\n      data: mainFacets[facetName],\n      exhaustive: mainSubResponse.exhaustiveFacetsCount,\n    };\n    excludes.forEach(function (facetValue) {\n      self.facets[position] = self.facets[position] || { name: facetName };\n      self.facets[position].data = self.facets[position].data || {};\n      self.facets[position].data[facetValue] = 0;\n    });\n  });\n\n  /**\n   * @type {Array}\n   */\n  this.hierarchicalFacets = this.hierarchicalFacets.map(\n    generateHierarchicalTree(state)\n  );\n\n  /**\n   * @type {Array}\n   */\n  this.facets = compact(this.facets);\n  /**\n   * @type {Array}\n   */\n  this.disjunctiveFacets = compact(this.disjunctiveFacets);\n\n  this._state = state;\n}\n\n/**\n * Get a facet object with its name\n * @deprecated\n * @param {string} name name of the faceted attribute\n * @return {SearchResults.Facet} the facet object\n */\nSearchResults.prototype.getFacetByName = function (name) {\n  function predicate(facet) {\n    return facet.name === name;\n  }\n\n  return (\n    find(this.facets, predicate) ||\n    find(this.disjunctiveFacets, predicate) ||\n    find(this.hierarchicalFacets, predicate)\n  );\n};\n\n/**\n * Get the facet values of a specified attribute from a SearchResults object.\n * @private\n * @param {SearchResults} results the search results to search in\n * @param {string} attribute name of the faceted attribute to search for\n * @return {array|object} facet values. For the hierarchical facets it is an object.\n */\nfunction extractNormalizedFacetValues(results, attribute) {\n  function predicate(facet) {\n    return facet.name === attribute;\n  }\n\n  if (results._state.isConjunctiveFacet(attribute)) {\n    var facet = find(results.facets, predicate);\n    if (!facet) return [];\n\n    return Object.keys(facet.data).map(function (name) {\n      var value = escapeFacetValue(name);\n      return {\n        name: name,\n        escapedValue: value,\n        count: facet.data[name],\n        isRefined: results._state.isFacetRefined(attribute, value),\n        isExcluded: results._state.isExcludeRefined(attribute, name),\n      };\n    });\n  } else if (results._state.isDisjunctiveFacet(attribute)) {\n    var disjunctiveFacet = find(results.disjunctiveFacets, predicate);\n    if (!disjunctiveFacet) return [];\n\n    return Object.keys(disjunctiveFacet.data).map(function (name) {\n      var value = escapeFacetValue(name);\n      return {\n        name: name,\n        escapedValue: value,\n        count: disjunctiveFacet.data[name],\n        isRefined: results._state.isDisjunctiveFacetRefined(attribute, value),\n      };\n    });\n  } else if (results._state.isHierarchicalFacet(attribute)) {\n    var hierarchicalFacetValues = find(results.hierarchicalFacets, predicate);\n    if (!hierarchicalFacetValues) return hierarchicalFacetValues;\n\n    var hierarchicalFacet =\n      results._state.getHierarchicalFacetByName(attribute);\n    var separator =\n      results._state._getHierarchicalFacetSeparator(hierarchicalFacet);\n    var currentRefinement = unescapeFacetValue(\n      results._state.getHierarchicalRefinement(attribute)[0] || ''\n    );\n\n    if (currentRefinement.indexOf(hierarchicalFacet.rootPath) === 0) {\n      currentRefinement = currentRefinement.replace(\n        hierarchicalFacet.rootPath + separator,\n        ''\n      );\n    }\n\n    var currentRefinementSplit = currentRefinement.split(separator);\n    currentRefinementSplit.unshift(attribute);\n\n    setIsRefined(hierarchicalFacetValues, currentRefinementSplit, 0);\n\n    return hierarchicalFacetValues;\n  }\n\n  return undefined;\n}\n\n/**\n * Set the isRefined of a hierarchical facet result based on the current state.\n * @param {SearchResults.HierarchicalFacet} item Hierarchical facet to fix\n * @param {string[]} currentRefinement array of parts of the current hierarchical refinement\n * @param {number} depth recursion depth in the currentRefinement\n * @return {undefined} function mutates the item\n */\nfunction setIsRefined(item, currentRefinement, depth) {\n  item.isRefined = item.name === currentRefinement[depth];\n  if (item.data) {\n    item.data.forEach(function (child) {\n      setIsRefined(child, currentRefinement, depth + 1);\n    });\n  }\n}\n\n/**\n * Sort nodes of a hierarchical or disjunctive facet results\n * @private\n * @param {function} sortFn sort function to apply\n * @param {HierarchicalFacet|Array} node node upon which we want to apply the sort\n * @param {string[]} names attribute names\n * @param {number} [level=0] current index in the names array\n * @return {HierarchicalFacet|Array} sorted node\n */\nfunction recSort(sortFn, node, names, level) {\n  level = level || 0;\n\n  if (Array.isArray(node)) {\n    return sortFn(node, names[level]);\n  }\n\n  if (!node.data || node.data.length === 0) {\n    return node;\n  }\n\n  var children = node.data.map(function (childNode) {\n    return recSort(sortFn, childNode, names, level + 1);\n  });\n  var sortedChildren = sortFn(children, names[level]);\n  var newNode = defaultsPure({ data: sortedChildren }, node);\n  return newNode;\n}\n\nSearchResults.DEFAULT_SORT = ['isRefined:desc', 'count:desc', 'name:asc'];\n\nfunction vanillaSortFn(order, data) {\n  return data.sort(order);\n}\n\n/**\n * @typedef FacetOrdering\n * @type {Object}\n * @property {string[]} [order]\n * @property {'count' | 'alpha' | 'hidden'} [sortRemainingBy]\n */\n\n/**\n * Sorts facet arrays via their facet ordering\n * @param {Array} facetValues the values\n * @param {FacetOrdering} facetOrdering the ordering\n * @returns {Array} the sorted facet values\n */\nfunction sortViaFacetOrdering(facetValues, facetOrdering) {\n  var orderedFacets = [];\n  var remainingFacets = [];\n\n  var order = facetOrdering.order || [];\n  /**\n   * an object with the keys being the values in order, the values their index:\n   * ['one', 'two'] -> { one: 0, two: 1 }\n   */\n  var reverseOrder = order.reduce(function (acc, name, i) {\n    acc[name] = i;\n    return acc;\n  }, {});\n\n  facetValues.forEach(function (item) {\n    // hierarchical facets get sorted using their raw name\n    var name = item.path || item.name;\n    if (reverseOrder[name] !== undefined) {\n      orderedFacets[reverseOrder[name]] = item;\n    } else {\n      remainingFacets.push(item);\n    }\n  });\n\n  orderedFacets = orderedFacets.filter(function (facet) {\n    return facet;\n  });\n\n  var sortRemainingBy = facetOrdering.sortRemainingBy;\n  var ordering;\n  if (sortRemainingBy === 'hidden') {\n    return orderedFacets;\n  } else if (sortRemainingBy === 'alpha') {\n    ordering = [\n      ['path', 'name'],\n      ['asc', 'asc'],\n    ];\n  } else {\n    ordering = [['count'], ['desc']];\n  }\n\n  return orderedFacets.concat(\n    orderBy(remainingFacets, ordering[0], ordering[1])\n  );\n}\n\n/**\n * @param {SearchResults} results the search results class\n * @param {string} attribute the attribute to retrieve ordering of\n * @returns {FacetOrdering | undefined} the facet ordering\n */\nfunction getFacetOrdering(results, attribute) {\n  return (\n    results.renderingContent &&\n    results.renderingContent.facetOrdering &&\n    results.renderingContent.facetOrdering.values &&\n    results.renderingContent.facetOrdering.values[attribute]\n  );\n}\n\n/**\n * Get a the list of values for a given facet attribute. Those values are sorted\n * refinement first, descending count (bigger value on top), and name ascending\n * (alphabetical order). The sort formula can overridden using either string based\n * predicates or a function.\n *\n * This method will return all the values returned by the Algolia engine plus all\n * the values already refined. This means that it can happen that the\n * `maxValuesPerFacet` [configuration](https://www.algolia.com/doc/rest-api/search#param-maxValuesPerFacet)\n * might not be respected if you have facet values that are already refined.\n * @param {string} attribute attribute name\n * @param {object} opts configuration options.\n * @param {boolean} [opts.facetOrdering]\n * Force the use of facetOrdering from the result if a sortBy is present. If\n * sortBy isn't present, facetOrdering will be used automatically.\n * @param {Array.<string> | function} opts.sortBy\n * When using strings, it consists of\n * the name of the [FacetValue](#SearchResults.FacetValue) or the\n * [HierarchicalFacet](#SearchResults.HierarchicalFacet) attributes with the\n * order (`asc` or `desc`). For example to order the value by count, the\n * argument would be `['count:asc']`.\n *\n * If only the attribute name is specified, the ordering defaults to the one\n * specified in the default value for this attribute.\n *\n * When not specified, the order is\n * ascending.  This parameter can also be a function which takes two facet\n * values and should return a number, 0 if equal, 1 if the first argument is\n * bigger or -1 otherwise.\n *\n * The default value for this attribute `['isRefined:desc', 'count:desc', 'name:asc']`\n * @return {FacetValue[]|HierarchicalFacet|undefined} depending on the type of facet of\n * the attribute requested (hierarchical, disjunctive or conjunctive)\n * @example\n * helper.on('result', function(event){\n *   //get values ordered only by name ascending using the string predicate\n *   event.results.getFacetValues('city', {sortBy: ['name:asc']});\n *   //get values  ordered only by count ascending using a function\n *   event.results.getFacetValues('city', {\n *     // this is equivalent to ['count:asc']\n *     sortBy: function(a, b) {\n *       if (a.count === b.count) return 0;\n *       if (a.count > b.count)   return 1;\n *       if (b.count > a.count)   return -1;\n *     }\n *   });\n * });\n */\nSearchResults.prototype.getFacetValues = function (attribute, opts) {\n  var facetValues = extractNormalizedFacetValues(this, attribute);\n  if (!facetValues) {\n    return undefined;\n  }\n\n  var options = defaultsPure({}, opts, {\n    sortBy: SearchResults.DEFAULT_SORT,\n    // if no sortBy is given, attempt to sort based on facetOrdering\n    // if it is given, we still allow to sort via facet ordering first\n    facetOrdering: !(opts && opts.sortBy),\n  });\n\n  // eslint-disable-next-line consistent-this\n  var results = this;\n  var attributes;\n  if (Array.isArray(facetValues)) {\n    attributes = [attribute];\n  } else {\n    var config = results._state.getHierarchicalFacetByName(facetValues.name);\n    attributes = config.attributes;\n  }\n\n  return recSort(\n    function (data, facetName) {\n      if (options.facetOrdering) {\n        var facetOrdering = getFacetOrdering(results, facetName);\n        if (facetOrdering) {\n          return sortViaFacetOrdering(data, facetOrdering);\n        }\n      }\n\n      if (Array.isArray(options.sortBy)) {\n        var order = formatSort(options.sortBy, SearchResults.DEFAULT_SORT);\n        return orderBy(data, order[0], order[1]);\n      } else if (typeof options.sortBy === 'function') {\n        return vanillaSortFn(options.sortBy, data);\n      }\n      throw new Error(\n        'options.sortBy is optional but if defined it must be ' +\n          'either an array of string (predicates) or a sorting function'\n      );\n    },\n    facetValues,\n    attributes\n  );\n};\n\n/**\n * Returns the facet stats if attribute is defined and the facet contains some.\n * Otherwise returns undefined.\n * @param {string} attribute name of the faceted attribute\n * @return {object} The stats of the facet\n */\nSearchResults.prototype.getFacetStats = function (attribute) {\n  if (this._state.isConjunctiveFacet(attribute)) {\n    return getFacetStatsIfAvailable(this.facets, attribute);\n  } else if (this._state.isDisjunctiveFacet(attribute)) {\n    return getFacetStatsIfAvailable(this.disjunctiveFacets, attribute);\n  }\n\n  return undefined;\n};\n\n/**\n * @typedef {Object} FacetListItem\n * @property {string} name\n */\n\n/**\n * @param {FacetListItem[]} facetList (has more items, but enough for here)\n * @param {string} facetName The attribute to look for\n * @return {object|undefined} The stats of the facet\n */\nfunction getFacetStatsIfAvailable(facetList, facetName) {\n  var data = find(facetList, function (facet) {\n    return facet.name === facetName;\n  });\n  return data && data.stats;\n}\n\n/**\n * Returns all refinements for all filters + tags. It also provides\n * additional information: count and exhaustiveness for each filter.\n *\n * See the [refinement type](#Refinement) for an exhaustive view of the available\n * data.\n *\n * Note that for a numeric refinement, results are grouped per operator, this\n * means that it will return responses for operators which are empty.\n *\n * @return {Array.<Refinement>} all the refinements\n */\nSearchResults.prototype.getRefinements = function () {\n  var state = this._state;\n  // eslint-disable-next-line consistent-this\n  var results = this;\n  var res = [];\n\n  Object.keys(state.facetsRefinements).forEach(function (attributeName) {\n    state.facetsRefinements[attributeName].forEach(function (name) {\n      res.push(\n        getRefinement(state, 'facet', attributeName, name, results.facets)\n      );\n    });\n  });\n\n  Object.keys(state.facetsExcludes).forEach(function (attributeName) {\n    state.facetsExcludes[attributeName].forEach(function (name) {\n      res.push(\n        getRefinement(state, 'exclude', attributeName, name, results.facets)\n      );\n    });\n  });\n\n  Object.keys(state.disjunctiveFacetsRefinements).forEach(function (\n    attributeName\n  ) {\n    state.disjunctiveFacetsRefinements[attributeName].forEach(function (name) {\n      res.push(\n        getRefinement(\n          state,\n          'disjunctive',\n          attributeName,\n          name,\n          results.disjunctiveFacets\n        )\n      );\n    });\n  });\n\n  Object.keys(state.hierarchicalFacetsRefinements).forEach(function (\n    attributeName\n  ) {\n    state.hierarchicalFacetsRefinements[attributeName].forEach(function (name) {\n      res.push(\n        getHierarchicalRefinement(\n          state,\n          attributeName,\n          name,\n          results.hierarchicalFacets\n        )\n      );\n    });\n  });\n\n  Object.keys(state.numericRefinements).forEach(function (attributeName) {\n    var operators = state.numericRefinements[attributeName];\n    Object.keys(operators).forEach(function (operator) {\n      operators[operator].forEach(function (value) {\n        res.push({\n          type: 'numeric',\n          attributeName: attributeName,\n          name: value,\n          numericValue: value,\n          operator: operator,\n        });\n      });\n    });\n  });\n\n  state.tagRefinements.forEach(function (name) {\n    res.push({ type: 'tag', attributeName: '_tags', name: name });\n  });\n\n  return res;\n};\n\n/**\n * @typedef {Object} Facet\n * @property {string} name\n * @property {Object} data\n * @property {boolean} exhaustive\n */\n\n/**\n * @param {SearchParameters} state the current state\n * @param {string} type the type of the refinement\n * @param {string} attributeName The attribute of the facet\n * @param {*} name The name of the facet\n * @param {Facet[]} resultsFacets facets from the results\n * @return {Refinement} the refinement\n */\nfunction getRefinement(state, type, attributeName, name, resultsFacets) {\n  var facet = find(resultsFacets, function (f) {\n    return f.name === attributeName;\n  });\n  var count = facet && facet.data && facet.data[name] ? facet.data[name] : 0;\n  var exhaustive = (facet && facet.exhaustive) || false;\n\n  return {\n    type: type,\n    attributeName: attributeName,\n    name: name,\n    count: count,\n    exhaustive: exhaustive,\n  };\n}\n\n/**\n * @param {SearchParameters} state the current state\n * @param {string} attributeName the attribute of the hierarchical facet\n * @param {string} name the name of the facet\n * @param {Facet[]} resultsFacets facets from the results\n * @return {HierarchicalFacet} the hierarchical facet\n */\nfunction getHierarchicalRefinement(state, attributeName, name, resultsFacets) {\n  var facetDeclaration = state.getHierarchicalFacetByName(attributeName);\n  var separator = state._getHierarchicalFacetSeparator(facetDeclaration);\n  var split = name.split(separator);\n  var rootFacet = find(resultsFacets, function (facet) {\n    return facet.name === attributeName;\n  });\n\n  var facet = split.reduce(function (intermediateFacet, part) {\n    var newFacet =\n      intermediateFacet &&\n      find(intermediateFacet.data, function (f) {\n        return f.name === part;\n      });\n    return newFacet !== undefined ? newFacet : intermediateFacet;\n  }, rootFacet);\n\n  var count = (facet && facet.count) || 0;\n  var exhaustive = (facet && facet.exhaustive) || false;\n  var path = (facet && facet.path) || '';\n\n  return {\n    type: 'hierarchical',\n    attributeName: attributeName,\n    name: path,\n    count: count,\n    exhaustive: exhaustive,\n  };\n}\n\nmodule.exports = SearchResults;\n","'use strict';\n\nvar EventEmitter = require('@algolia/events');\n\nvar DerivedHelper = require('./DerivedHelper');\nvar escapeFacetValue = require('./functions/escapeFacetValue').escapeFacetValue;\nvar inherits = require('./functions/inherits');\nvar merge = require('./functions/merge');\nvar objectHasKeys = require('./functions/objectHasKeys');\nvar omit = require('./functions/omit');\nvar requestBuilder = require('./requestBuilder');\nvar SearchParameters = require('./SearchParameters');\nvar SearchResults = require('./SearchResults');\nvar version = require('./version');\n\n/**\n * Event triggered when a parameter is set or updated\n * @event AlgoliaSearchHelper#event:change\n * @property {object} event\n * @property {SearchParameters} event.state the current parameters with the latest changes applied\n * @property {SearchResults} event.results the previous results received from Algolia. `null` before the first request\n * @example\n * helper.on('change', function(event) {\n *   console.log('The parameters have changed');\n * });\n */\n\n/**\n * Event triggered when a main search is sent to Algolia\n * @event AlgoliaSearchHelper#event:search\n * @property {object} event\n * @property {SearchParameters} event.state the parameters used for this search\n * @property {SearchResults} event.results the results from the previous search. `null` if it is the first search.\n * @example\n * helper.on('search', function(event) {\n *   console.log('Search sent');\n * });\n */\n\n/**\n * Event triggered when a search using `searchForFacetValues` is sent to Algolia\n * @event AlgoliaSearchHelper#event:searchForFacetValues\n * @property {object} event\n * @property {SearchParameters} event.state the parameters used for this search it is the first search.\n * @property {string} event.facet the facet searched into\n * @property {string} event.query the query used to search in the facets\n * @example\n * helper.on('searchForFacetValues', function(event) {\n *   console.log('searchForFacetValues sent');\n * });\n */\n\n/**\n * Event triggered when a search using `searchOnce` is sent to Algolia\n * @event AlgoliaSearchHelper#event:searchOnce\n * @property {object} event\n * @property {SearchParameters} event.state the parameters used for this search it is the first search.\n * @example\n * helper.on('searchOnce', function(event) {\n *   console.log('searchOnce sent');\n * });\n */\n\n/**\n * Event triggered when the results are retrieved from Algolia\n * @event AlgoliaSearchHelper#event:result\n * @property {object} event\n * @property {SearchResults} event.results the results received from Algolia\n * @property {SearchParameters} event.state the parameters used to query Algolia. Those might be different from the one in the helper instance (for example if the network is unreliable).\n * @example\n * helper.on('result', function(event) {\n *   console.log('Search results received');\n * });\n */\n\n/**\n * Event triggered when Algolia sends back an error. For example, if an unknown parameter is\n * used, the error can be caught using this event.\n * @event AlgoliaSearchHelper#event:error\n * @property {object} event\n * @property {Error} event.error the error returned by the Algolia.\n * @example\n * helper.on('error', function(event) {\n *   console.log('Houston we got a problem.');\n * });\n */\n\n/**\n * Event triggered when the queue of queries have been depleted (with any result or outdated queries)\n * @event AlgoliaSearchHelper#event:searchQueueEmpty\n * @example\n * helper.on('searchQueueEmpty', function() {\n *   console.log('No more search pending');\n *   // This is received before the result event if we're not expecting new results\n * });\n *\n * helper.search();\n */\n\n/**\n * Initialize a new AlgoliaSearchHelper\n * @class\n * @classdesc The AlgoliaSearchHelper is a class that ease the management of the\n * search. It provides an event based interface for search callbacks:\n *  - change: when the internal search state is changed.\n *    This event contains a {@link SearchParameters} object and the\n *    {@link SearchResults} of the last result if any.\n *  - search: when a search is triggered using the `search()` method.\n *  - result: when the response is retrieved from Algolia and is processed.\n *    This event contains a {@link SearchResults} object and the\n *    {@link SearchParameters} corresponding to this answer.\n *  - error: when the response is an error. This event contains the error returned by the server.\n * @param  {AlgoliaSearch} client an AlgoliaSearch client\n * @param  {string} index the index name to query\n * @param  {SearchParameters | object} options an object defining the initial\n * config of the search. It doesn't have to be a {SearchParameters},\n * just an object containing the properties you need from it.\n */\nfunction AlgoliaSearchHelper(client, index, options) {\n  if (typeof client.addAlgoliaAgent === 'function') {\n    client.addAlgoliaAgent('JS Helper (' + version + ')');\n  }\n\n  this.setClient(client);\n  var opts = options || {};\n  opts.index = index;\n  this.state = SearchParameters.make(opts);\n  this.lastResults = null;\n  this._queryId = 0;\n  this._lastQueryIdReceived = -1;\n  this.derivedHelpers = [];\n  this._currentNbQueries = 0;\n}\n\ninherits(AlgoliaSearchHelper, EventEmitter);\n\n/**\n * Start the search with the parameters set in the state. When the\n * method is called, it triggers a `search` event. The results will\n * be available through the `result` event. If an error occurs, an\n * `error` will be fired instead.\n * @return {AlgoliaSearchHelper} Method is chainable, it returns itself\n * @fires search\n * @fires result\n * @fires error\n * @chainable\n */\nAlgoliaSearchHelper.prototype.search = function () {\n  this._search({ onlyWithDerivedHelpers: false });\n  return this;\n};\n\nAlgoliaSearchHelper.prototype.searchOnlyWithDerivedHelpers = function () {\n  this._search({ onlyWithDerivedHelpers: true });\n  return this;\n};\n\n/**\n * Gets the search query parameters that would be sent to the Algolia Client\n * for the hits\n * @return {object} Query Parameters\n */\nAlgoliaSearchHelper.prototype.getQuery = function () {\n  var state = this.state;\n  return requestBuilder._getHitsSearchParams(state);\n};\n\n/**\n * Start a search using a modified version of the current state. This method does\n * not trigger the helper lifecycle and does not modify the state kept internally\n * by the helper. This second aspect means that the next search call will be the\n * same as a search call before calling searchOnce.\n * @param {object} options can contain all the parameters that can be set to SearchParameters\n * plus the index\n * @param {function} [cb] optional callback executed when the response from the\n * server is back.\n * @return {promise|undefined} if a callback is passed the method returns undefined\n * otherwise it returns a promise containing an object with two keys :\n *  - content with a SearchResults\n *  - state with the state used for the query as a SearchParameters\n * @example\n * // Changing the number of records returned per page to 1\n * // This example uses the callback API\n * var state = helper.searchOnce({hitsPerPage: 1},\n *   function(error, content, state) {\n *     // if an error occurred it will be passed in error, otherwise its value is null\n *     // content contains the results formatted as a SearchResults\n *     // state is the instance of SearchParameters used for this search\n *   });\n * @example\n * // Changing the number of records returned per page to 1\n * // This example uses the promise API\n * var state1 = helper.searchOnce({hitsPerPage: 1})\n *                 .then(promiseHandler);\n *\n * function promiseHandler(res) {\n *   // res contains\n *   // {\n *   //   content : SearchResults\n *   //   state   : SearchParameters (the one used for this specific search)\n *   // }\n * }\n */\nAlgoliaSearchHelper.prototype.searchOnce = function (options, cb) {\n  var tempState = !options\n    ? this.state\n    : this.state.setQueryParameters(options);\n  var queries = requestBuilder._getQueries(tempState.index, tempState);\n  // eslint-disable-next-line consistent-this\n  var self = this;\n\n  this._currentNbQueries++;\n\n  this.emit('searchOnce', {\n    state: tempState,\n  });\n\n  if (cb) {\n    this.client\n      .search(queries)\n      .then(function (content) {\n        self._currentNbQueries--;\n        if (self._currentNbQueries === 0) {\n          self.emit('searchQueueEmpty');\n        }\n\n        cb(null, new SearchResults(tempState, content.results), tempState);\n      })\n      .catch(function (err) {\n        self._currentNbQueries--;\n        if (self._currentNbQueries === 0) {\n          self.emit('searchQueueEmpty');\n        }\n\n        cb(err, null, tempState);\n      });\n\n    return undefined;\n  }\n\n  return this.client.search(queries).then(\n    function (content) {\n      self._currentNbQueries--;\n      if (self._currentNbQueries === 0) self.emit('searchQueueEmpty');\n      return {\n        content: new SearchResults(tempState, content.results),\n        state: tempState,\n        _originalResponse: content,\n      };\n    },\n    function (e) {\n      self._currentNbQueries--;\n      if (self._currentNbQueries === 0) self.emit('searchQueueEmpty');\n      throw e;\n    }\n  );\n};\n\n/**\n * Start the search for answers with the parameters set in the state.\n * This method returns a promise.\n * @param {Object} options - the options for answers API call\n * @param {string[]} options.attributesForPrediction - Attributes to use for predictions. If empty, `searchableAttributes` is used instead.\n * @param {string[]} options.queryLanguages - The languages in the query. Currently only supports ['en'].\n * @param {number} options.nbHits - Maximum number of answers to retrieve from the Answers Engine. Cannot be greater than 1000.\n *\n * @return {promise} the answer results\n * @deprecated answers is deprecated and will be replaced with new initiatives\n */\nAlgoliaSearchHelper.prototype.findAnswers = function (options) {\n  // eslint-disable-next-line no-console\n  console.warn('[algoliasearch-helper] answers is no longer supported');\n  var state = this.state;\n  var derivedHelper = this.derivedHelpers[0];\n  if (!derivedHelper) {\n    return Promise.resolve([]);\n  }\n  var derivedState = derivedHelper.getModifiedState(state);\n  var data = merge(\n    {\n      attributesForPrediction: options.attributesForPrediction,\n      nbHits: options.nbHits,\n    },\n    {\n      params: omit(requestBuilder._getHitsSearchParams(derivedState), [\n        'attributesToSnippet',\n        'hitsPerPage',\n        'restrictSearchableAttributes',\n        'snippetEllipsisText',\n      ]),\n    }\n  );\n\n  var errorMessage =\n    'search for answers was called, but this client does not have a function client.initIndex(index).findAnswers';\n  if (typeof this.client.initIndex !== 'function') {\n    throw new Error(errorMessage);\n  }\n  var index = this.client.initIndex(derivedState.index);\n  if (typeof index.findAnswers !== 'function') {\n    throw new Error(errorMessage);\n  }\n  return index.findAnswers(derivedState.query, options.queryLanguages, data);\n};\n\n/**\n * Structure of each result when using\n * [`searchForFacetValues()`](reference.html#AlgoliaSearchHelper#searchForFacetValues)\n * @typedef FacetSearchHit\n * @type {object}\n * @property {string} value the facet value\n * @property {string} highlighted the facet value highlighted with the query string\n * @property {number} count number of occurrence of this facet value\n * @property {boolean} isRefined true if the value is already refined\n */\n\n/**\n * Structure of the data resolved by the\n * [`searchForFacetValues()`](reference.html#AlgoliaSearchHelper#searchForFacetValues)\n * promise.\n * @typedef FacetSearchResult\n * @type {object}\n * @property {FacetSearchHit} facetHits the results for this search for facet values\n * @property {number} processingTimeMS time taken by the query inside the engine\n */\n\n/**\n * Search for facet values based on an query and the name of a faceted attribute. This\n * triggers a search and will return a promise. On top of using the query, it also sends\n * the parameters from the state so that the search is narrowed down to only the possible values.\n *\n * See the description of [FacetSearchResult](reference.html#FacetSearchResult)\n * @param {string} facet the name of the faceted attribute\n * @param {string} query the string query for the search\n * @param {number} [maxFacetHits] the maximum number values returned. Should be > 0 and <= 100\n * @param {object} [userState] the set of custom parameters to use on top of the current state. Setting a property to `undefined` removes\n * it in the generated query.\n * @return {promise.<FacetSearchResult>} the results of the search\n */\nAlgoliaSearchHelper.prototype.searchForFacetValues = function (\n  facet,\n  query,\n  maxFacetHits,\n  userState\n) {\n  var clientHasSFFV = typeof this.client.searchForFacetValues === 'function';\n  var clientHasInitIndex = typeof this.client.initIndex === 'function';\n  if (\n    !clientHasSFFV &&\n    !clientHasInitIndex &&\n    typeof this.client.search !== 'function'\n  ) {\n    throw new Error(\n      'search for facet values (searchable) was called, but this client does not have a function client.searchForFacetValues or client.initIndex(index).searchForFacetValues'\n    );\n  }\n\n  var state = this.state.setQueryParameters(userState || {});\n  var isDisjunctive = state.isDisjunctiveFacet(facet);\n  var algoliaQuery = requestBuilder.getSearchForFacetQuery(\n    facet,\n    query,\n    maxFacetHits,\n    state\n  );\n\n  this._currentNbQueries++;\n  // eslint-disable-next-line consistent-this\n  var self = this;\n  var searchForFacetValuesPromise;\n  // newer algoliasearch ^3.27.1 - ~4.0.0\n  if (clientHasSFFV) {\n    searchForFacetValuesPromise = this.client.searchForFacetValues([\n      { indexName: state.index, params: algoliaQuery },\n    ]);\n    // algoliasearch < 3.27.1\n  } else if (clientHasInitIndex) {\n    searchForFacetValuesPromise = this.client\n      .initIndex(state.index)\n      .searchForFacetValues(algoliaQuery);\n    // algoliasearch ~5.0.0\n  } else {\n    // @MAJOR only use client.search\n    delete algoliaQuery.facetName;\n    searchForFacetValuesPromise = this.client\n      .search([\n        {\n          type: 'facet',\n          facet: facet,\n          indexName: state.index,\n          params: algoliaQuery,\n        },\n      ])\n      .then(function processResponse(response) {\n        return response.results[0];\n      });\n  }\n\n  this.emit('searchForFacetValues', {\n    state: state,\n    facet: facet,\n    query: query,\n  });\n\n  return searchForFacetValuesPromise.then(\n    function addIsRefined(content) {\n      self._currentNbQueries--;\n      if (self._currentNbQueries === 0) self.emit('searchQueueEmpty');\n\n      content = Array.isArray(content) ? content[0] : content;\n\n      content.facetHits.forEach(function (f) {\n        f.escapedValue = escapeFacetValue(f.value);\n        f.isRefined = isDisjunctive\n          ? state.isDisjunctiveFacetRefined(facet, f.escapedValue)\n          : state.isFacetRefined(facet, f.escapedValue);\n      });\n\n      return content;\n    },\n    function (e) {\n      self._currentNbQueries--;\n      if (self._currentNbQueries === 0) self.emit('searchQueueEmpty');\n      throw e;\n    }\n  );\n};\n\n/**\n * Sets the text query used for the search.\n *\n * This method resets the current page to 0.\n * @param  {string} q the user query\n * @return {AlgoliaSearchHelper} Method is chainable, it returns itself\n * @fires change\n * @chainable\n */\nAlgoliaSearchHelper.prototype.setQuery = function (q) {\n  this._change({\n    state: this.state.resetPage().setQuery(q),\n    isPageReset: true,\n  });\n\n  return this;\n};\n\n/**\n * Remove all the types of refinements except tags. A string can be provided to remove\n * only the refinements of a specific attribute. For more advanced use case, you can\n * provide a function instead. This function should follow the\n * [clearCallback definition](#SearchParameters.clearCallback).\n *\n * This method resets the current page to 0.\n * @param {string} [name] optional name of the facet / attribute on which we want to remove all refinements\n * @return {AlgoliaSearchHelper} Method is chainable, it returns itself\n * @fires change\n * @chainable\n * @example\n * // Removing all the refinements\n * helper.clearRefinements().search();\n * @example\n * // Removing all the filters on a the category attribute.\n * helper.clearRefinements('category').search();\n * @example\n * // Removing only the exclude filters on the category facet.\n * helper.clearRefinements(function(value, attribute, type) {\n *   return type === 'exclude' && attribute === 'category';\n * }).search();\n */\nAlgoliaSearchHelper.prototype.clearRefinements = function (name) {\n  this._change({\n    state: this.state.resetPage().clearRefinements(name),\n    isPageReset: true,\n  });\n\n  return this;\n};\n\n/**\n * Remove all the tag filters.\n *\n * This method resets the current page to 0.\n * @return {AlgoliaSearchHelper} Method is chainable, it returns itself\n * @fires change\n * @chainable\n */\nAlgoliaSearchHelper.prototype.clearTags = function () {\n  this._change({\n    state: this.state.resetPage().clearTags(),\n    isPageReset: true,\n  });\n\n  return this;\n};\n\n/**\n * Adds a disjunctive filter to a faceted attribute with the `value` provided. If the\n * filter is already set, it doesn't change the filters.\n *\n * This method resets the current page to 0.\n * @param  {string} facet the facet to refine\n * @param  {string} value the associated value (will be converted to string)\n * @return {AlgoliaSearchHelper} Method is chainable, it returns itself\n * @fires change\n * @chainable\n */\nAlgoliaSearchHelper.prototype.addDisjunctiveFacetRefinement = function (\n  facet,\n  value\n) {\n  this._change({\n    state: this.state.resetPage().addDisjunctiveFacetRefinement(facet, value),\n    isPageReset: true,\n  });\n\n  return this;\n};\n\n// eslint-disable-next-line valid-jsdoc\n/**\n * @deprecated since version 2.4.0, see {@link AlgoliaSearchHelper#addDisjunctiveFacetRefinement}\n */\nAlgoliaSearchHelper.prototype.addDisjunctiveRefine = function () {\n  return this.addDisjunctiveFacetRefinement.apply(this, arguments);\n};\n\n/**\n * Adds a refinement on a hierarchical facet. It will throw\n * an exception if the facet is not defined or if the facet\n * is already refined.\n *\n * This method resets the current page to 0.\n * @param {string} facet the facet name\n * @param {string} path the hierarchical facet path\n * @return {AlgoliaSearchHelper} Method is chainable, it returns itself\n * @throws Error if the facet is not defined or if the facet is refined\n * @chainable\n * @fires change\n */\nAlgoliaSearchHelper.prototype.addHierarchicalFacetRefinement = function (\n  facet,\n  path\n) {\n  this._change({\n    state: this.state.resetPage().addHierarchicalFacetRefinement(facet, path),\n    isPageReset: true,\n  });\n\n  return this;\n};\n\n/**\n * Adds a an numeric filter to an attribute with the `operator` and `value` provided. If the\n * filter is already set, it doesn't change the filters.\n *\n * This method resets the current page to 0.\n * @param  {string} attribute the attribute on which the numeric filter applies\n * @param  {string} operator the operator of the filter\n * @param  {number} value the value of the filter\n * @return {AlgoliaSearchHelper} Method is chainable, it returns itself\n * @fires change\n * @chainable\n */\nAlgoliaSearchHelper.prototype.addNumericRefinement = function (\n  attribute,\n  operator,\n  value\n) {\n  this._change({\n    state: this.state\n      .resetPage()\n      .addNumericRefinement(attribute, operator, value),\n    isPageReset: true,\n  });\n\n  return this;\n};\n\n/**\n * Adds a filter to a faceted attribute with the `value` provided. If the\n * filter is already set, it doesn't change the filters.\n *\n * This method resets the current page to 0.\n * @param  {string} facet the facet to refine\n * @param  {string} value the associated value (will be converted to string)\n * @return {AlgoliaSearchHelper} Method is chainable, it returns itself\n * @fires change\n * @chainable\n */\nAlgoliaSearchHelper.prototype.addFacetRefinement = function (facet, value) {\n  this._change({\n    state: this.state.resetPage().addFacetRefinement(facet, value),\n    isPageReset: true,\n  });\n\n  return this;\n};\n\n// eslint-disable-next-line valid-jsdoc\n/**\n * @deprecated since version 2.4.0, see {@link AlgoliaSearchHelper#addFacetRefinement}\n */\nAlgoliaSearchHelper.prototype.addRefine = function () {\n  return this.addFacetRefinement.apply(this, arguments);\n};\n\n/**\n * Adds a an exclusion filter to a faceted attribute with the `value` provided. If the\n * filter is already set, it doesn't change the filters.\n *\n * This method resets the current page to 0.\n * @param  {string} facet the facet to refine\n * @param  {string} value the associated value (will be converted to string)\n * @return {AlgoliaSearchHelper} Method is chainable, it returns itself\n * @fires change\n * @chainable\n */\nAlgoliaSearchHelper.prototype.addFacetExclusion = function (facet, value) {\n  this._change({\n    state: this.state.resetPage().addExcludeRefinement(facet, value),\n    isPageReset: true,\n  });\n\n  return this;\n};\n\n// eslint-disable-next-line valid-jsdoc\n/**\n * @deprecated since version 2.4.0, see {@link AlgoliaSearchHelper#addFacetExclusion}\n */\nAlgoliaSearchHelper.prototype.addExclude = function () {\n  return this.addFacetExclusion.apply(this, arguments);\n};\n\n/**\n * Adds a tag filter with the `tag` provided. If the\n * filter is already set, it doesn't change the filters.\n *\n * This method resets the current page to 0.\n * @param {string} tag the tag to add to the filter\n * @return {AlgoliaSearchHelper} Method is chainable, it returns itself\n * @fires change\n * @chainable\n */\nAlgoliaSearchHelper.prototype.addTag = function (tag) {\n  this._change({\n    state: this.state.resetPage().addTagRefinement(tag),\n    isPageReset: true,\n  });\n\n  return this;\n};\n\n/**\n * Removes an numeric filter to an attribute with the `operator` and `value` provided. If the\n * filter is not set, it doesn't change the filters.\n *\n * Some parameters are optional, triggering different behavior:\n *  - if the value is not provided, then all the numeric value will be removed for the\n *  specified attribute/operator couple.\n *  - if the operator is not provided either, then all the numeric filter on this attribute\n *  will be removed.\n *\n * This method resets the current page to 0.\n * @param  {string} attribute the attribute on which the numeric filter applies\n * @param  {string} [operator] the operator of the filter\n * @param  {number} [value] the value of the filter\n * @return {AlgoliaSearchHelper} Method is chainable, it returns itself\n * @fires change\n * @chainable\n */\nAlgoliaSearchHelper.prototype.removeNumericRefinement = function (\n  attribute,\n  operator,\n  value\n) {\n  this._change({\n    state: this.state\n      .resetPage()\n      .removeNumericRefinement(attribute, operator, value),\n    isPageReset: true,\n  });\n\n  return this;\n};\n\n/**\n * Removes a disjunctive filter to a faceted attribute with the `value` provided. If the\n * filter is not set, it doesn't change the filters.\n *\n * If the value is omitted, then this method will remove all the filters for the\n * attribute.\n *\n * This method resets the current page to 0.\n * @param  {string} facet the facet to refine\n * @param  {string} [value] the associated value\n * @return {AlgoliaSearchHelper} Method is chainable, it returns itself\n * @fires change\n * @chainable\n */\nAlgoliaSearchHelper.prototype.removeDisjunctiveFacetRefinement = function (\n  facet,\n  value\n) {\n  this._change({\n    state: this.state\n      .resetPage()\n      .removeDisjunctiveFacetRefinement(facet, value),\n    isPageReset: true,\n  });\n\n  return this;\n};\n\n// eslint-disable-next-line valid-jsdoc\n/**\n * @deprecated since version 2.4.0, see {@link AlgoliaSearchHelper#removeDisjunctiveFacetRefinement}\n */\nAlgoliaSearchHelper.prototype.removeDisjunctiveRefine = function () {\n  return this.removeDisjunctiveFacetRefinement.apply(this, arguments);\n};\n\n/**\n * Removes the refinement set on a hierarchical facet.\n * @param {string} facet the facet name\n * @return {AlgoliaSearchHelper} Method is chainable, it returns itself\n * @throws Error if the facet is not defined or if the facet is not refined\n * @fires change\n * @chainable\n */\nAlgoliaSearchHelper.prototype.removeHierarchicalFacetRefinement = function (\n  facet\n) {\n  this._change({\n    state: this.state.resetPage().removeHierarchicalFacetRefinement(facet),\n    isPageReset: true,\n  });\n\n  return this;\n};\n\n/**\n * Removes a filter to a faceted attribute with the `value` provided. If the\n * filter is not set, it doesn't change the filters.\n *\n * If the value is omitted, then this method will remove all the filters for the\n * attribute.\n *\n * This method resets the current page to 0.\n * @param  {string} facet the facet to refine\n * @param  {string} [value] the associated value\n * @return {AlgoliaSearchHelper} Method is chainable, it returns itself\n * @fires change\n * @chainable\n */\nAlgoliaSearchHelper.prototype.removeFacetRefinement = function (facet, value) {\n  this._change({\n    state: this.state.resetPage().removeFacetRefinement(facet, value),\n    isPageReset: true,\n  });\n\n  return this;\n};\n\n// eslint-disable-next-line valid-jsdoc\n/**\n * @deprecated since version 2.4.0, see {@link AlgoliaSearchHelper#removeFacetRefinement}\n */\nAlgoliaSearchHelper.prototype.removeRefine = function () {\n  return this.removeFacetRefinement.apply(this, arguments);\n};\n\n/**\n * Removes an exclusion filter to a faceted attribute with the `value` provided. If the\n * filter is not set, it doesn't change the filters.\n *\n * If the value is omitted, then this method will remove all the filters for the\n * attribute.\n *\n * This method resets the current page to 0.\n * @param  {string} facet the facet to refine\n * @param  {string} [value] the associated value\n * @return {AlgoliaSearchHelper} Method is chainable, it returns itself\n * @fires change\n * @chainable\n */\nAlgoliaSearchHelper.prototype.removeFacetExclusion = function (facet, value) {\n  this._change({\n    state: this.state.resetPage().removeExcludeRefinement(facet, value),\n    isPageReset: true,\n  });\n\n  return this;\n};\n\n// eslint-disable-next-line valid-jsdoc\n/**\n * @deprecated since version 2.4.0, see {@link AlgoliaSearchHelper#removeFacetExclusion}\n */\nAlgoliaSearchHelper.prototype.removeExclude = function () {\n  return this.removeFacetExclusion.apply(this, arguments);\n};\n\n/**\n * Removes a tag filter with the `tag` provided. If the\n * filter is not set, it doesn't change the filters.\n *\n * This method resets the current page to 0.\n * @param {string} tag tag to remove from the filter\n * @return {AlgoliaSearchHelper} Method is chainable, it returns itself\n * @fires change\n * @chainable\n */\nAlgoliaSearchHelper.prototype.removeTag = function (tag) {\n  this._change({\n    state: this.state.resetPage().removeTagRefinement(tag),\n    isPageReset: true,\n  });\n\n  return this;\n};\n\n/**\n * Adds or removes an exclusion filter to a faceted attribute with the `value` provided. If\n * the value is set then it removes it, otherwise it adds the filter.\n *\n * This method resets the current page to 0.\n * @param  {string} facet the facet to refine\n * @param  {string} value the associated value\n * @return {AlgoliaSearchHelper} Method is chainable, it returns itself\n * @fires change\n * @chainable\n */\nAlgoliaSearchHelper.prototype.toggleFacetExclusion = function (facet, value) {\n  this._change({\n    state: this.state.resetPage().toggleExcludeFacetRefinement(facet, value),\n    isPageReset: true,\n  });\n\n  return this;\n};\n\n// eslint-disable-next-line valid-jsdoc\n/**\n * @deprecated since version 2.4.0, see {@link AlgoliaSearchHelper#toggleFacetExclusion}\n */\nAlgoliaSearchHelper.prototype.toggleExclude = function () {\n  return this.toggleFacetExclusion.apply(this, arguments);\n};\n\n/**\n * Adds or removes a filter to a faceted attribute with the `value` provided. If\n * the value is set then it removes it, otherwise it adds the filter.\n *\n * This method can be used for conjunctive, disjunctive and hierarchical filters.\n *\n * This method resets the current page to 0.\n * @param  {string} facet the facet to refine\n * @param  {string} value the associated value\n * @return {AlgoliaSearchHelper} Method is chainable, it returns itself\n * @throws Error will throw an error if the facet is not declared in the settings of the helper\n * @fires change\n * @chainable\n * @deprecated since version 2.19.0, see {@link AlgoliaSearchHelper#toggleFacetRefinement}\n */\nAlgoliaSearchHelper.prototype.toggleRefinement = function (facet, value) {\n  return this.toggleFacetRefinement(facet, value);\n};\n\n/**\n * Adds or removes a filter to a faceted attribute with the `value` provided. If\n * the value is set then it removes it, otherwise it adds the filter.\n *\n * This method can be used for conjunctive, disjunctive and hierarchical filters.\n *\n * This method resets the current page to 0.\n * @param  {string} facet the facet to refine\n * @param  {string} value the associated value\n * @return {AlgoliaSearchHelper} Method is chainable, it returns itself\n * @throws Error will throw an error if the facet is not declared in the settings of the helper\n * @fires change\n * @chainable\n */\nAlgoliaSearchHelper.prototype.toggleFacetRefinement = function (facet, value) {\n  this._change({\n    state: this.state.resetPage().toggleFacetRefinement(facet, value),\n    isPageReset: true,\n  });\n\n  return this;\n};\n\n// eslint-disable-next-line valid-jsdoc\n/**\n * @deprecated since version 2.4.0, see {@link AlgoliaSearchHelper#toggleFacetRefinement}\n */\nAlgoliaSearchHelper.prototype.toggleRefine = function () {\n  return this.toggleFacetRefinement.apply(this, arguments);\n};\n\n/**\n * Adds or removes a tag filter with the `value` provided. If\n * the value is set then it removes it, otherwise it adds the filter.\n *\n * This method resets the current page to 0.\n * @param {string} tag tag to remove or add\n * @return {AlgoliaSearchHelper} Method is chainable, it returns itself\n * @fires change\n * @chainable\n */\nAlgoliaSearchHelper.prototype.toggleTag = function (tag) {\n  this._change({\n    state: this.state.resetPage().toggleTagRefinement(tag),\n    isPageReset: true,\n  });\n\n  return this;\n};\n\n/**\n * Increments the page number by one.\n * @return {AlgoliaSearchHelper} Method is chainable, it returns itself\n * @fires change\n * @chainable\n * @example\n * helper.setPage(0).nextPage().getPage();\n * // returns 1\n */\nAlgoliaSearchHelper.prototype.nextPage = function () {\n  var page = this.state.page || 0;\n  return this.setPage(page + 1);\n};\n\n/**\n * Decrements the page number by one.\n * @fires change\n * @return {AlgoliaSearchHelper} Method is chainable, it returns itself\n * @chainable\n * @example\n * helper.setPage(1).previousPage().getPage();\n * // returns 0\n */\nAlgoliaSearchHelper.prototype.previousPage = function () {\n  var page = this.state.page || 0;\n  return this.setPage(page - 1);\n};\n\n/**\n * @private\n * @param {number} page The page number\n * @return {AlgoliaSearchHelper} Method is chainable, it returns itself\n * @chainable\n * @fires change\n */\nfunction setCurrentPage(page) {\n  if (page < 0) throw new Error('Page requested below 0.');\n\n  this._change({\n    state: this.state.setPage(page),\n    isPageReset: false,\n  });\n\n  return this;\n}\n\n/**\n * Change the current page\n * @deprecated\n * @param  {number} page The page number\n * @return {AlgoliaSearchHelper} Method is chainable, it returns itself\n * @fires change\n * @chainable\n */\nAlgoliaSearchHelper.prototype.setCurrentPage = setCurrentPage;\n\n/**\n * Updates the current page.\n * @function\n * @param  {number} page The page number\n * @return {AlgoliaSearchHelper} Method is chainable, it returns itself\n * @fires change\n * @chainable\n */\nAlgoliaSearchHelper.prototype.setPage = setCurrentPage;\n\n/**\n * Updates the name of the index that will be targeted by the query.\n *\n * This method resets the current page to 0.\n * @param {string} name the index name\n * @return {AlgoliaSearchHelper} Method is chainable, it returns itself\n * @fires change\n * @chainable\n */\nAlgoliaSearchHelper.prototype.setIndex = function (name) {\n  this._change({\n    state: this.state.resetPage().setIndex(name),\n    isPageReset: true,\n  });\n\n  return this;\n};\n\n/**\n * Update a parameter of the search. This method reset the page\n *\n * The complete list of parameters is available on the\n * [Algolia website](https://www.algolia.com/doc/rest#query-an-index).\n * The most commonly used parameters have their own [shortcuts](#query-parameters-shortcuts)\n * or benefit from higher-level APIs (all the kind of filters and facets have their own API)\n *\n * This method resets the current page to 0.\n * @param {string} parameter name of the parameter to update\n * @param {any} value new value of the parameter\n * @return {AlgoliaSearchHelper} Method is chainable, it returns itself\n * @fires change\n * @chainable\n * @example\n * helper.setQueryParameter('hitsPerPage', 20).search();\n */\nAlgoliaSearchHelper.prototype.setQueryParameter = function (parameter, value) {\n  this._change({\n    state: this.state.resetPage().setQueryParameter(parameter, value),\n    isPageReset: true,\n  });\n\n  return this;\n};\n\n/**\n * Set the whole state (warning: will erase previous state)\n * @param {SearchParameters} newState the whole new state\n * @return {AlgoliaSearchHelper} Method is chainable, it returns itself\n * @fires change\n * @chainable\n */\nAlgoliaSearchHelper.prototype.setState = function (newState) {\n  this._change({\n    state: SearchParameters.make(newState),\n    isPageReset: false,\n  });\n\n  return this;\n};\n\n/**\n * Override the current state without triggering a change event.\n * Do not use this method unless you know what you are doing. (see the example\n * for a legit use case)\n * @param {SearchParameters} newState the whole new state\n * @return {AlgoliaSearchHelper} Method is chainable, it returns itself\n * @example\n *  helper.on('change', function(state){\n *    // In this function you might want to find a way to store the state in the url/history\n *    updateYourURL(state)\n *  })\n *  window.onpopstate = function(event){\n *    // This is naive though as you should check if the state is really defined etc.\n *    helper.overrideStateWithoutTriggeringChangeEvent(event.state).search()\n *  }\n * @chainable\n */\nAlgoliaSearchHelper.prototype.overrideStateWithoutTriggeringChangeEvent =\n  function (newState) {\n    this.state = new SearchParameters(newState);\n    return this;\n  };\n\n/**\n * Check if an attribute has any numeric, conjunctive, disjunctive or hierarchical filters.\n * @param {string} attribute the name of the attribute\n * @return {boolean} true if the attribute is filtered by at least one value\n * @example\n * // hasRefinements works with numeric, conjunctive, disjunctive and hierarchical filters\n * helper.hasRefinements('price'); // false\n * helper.addNumericRefinement('price', '>', 100);\n * helper.hasRefinements('price'); // true\n *\n * helper.hasRefinements('color'); // false\n * helper.addFacetRefinement('color', 'blue');\n * helper.hasRefinements('color'); // true\n *\n * helper.hasRefinements('material'); // false\n * helper.addDisjunctiveFacetRefinement('material', 'plastic');\n * helper.hasRefinements('material'); // true\n *\n * helper.hasRefinements('categories'); // false\n * helper.toggleFacetRefinement('categories', 'kitchen > knife');\n * helper.hasRefinements('categories'); // true\n *\n */\nAlgoliaSearchHelper.prototype.hasRefinements = function (attribute) {\n  if (objectHasKeys(this.state.getNumericRefinements(attribute))) {\n    return true;\n  } else if (this.state.isConjunctiveFacet(attribute)) {\n    return this.state.isFacetRefined(attribute);\n  } else if (this.state.isDisjunctiveFacet(attribute)) {\n    return this.state.isDisjunctiveFacetRefined(attribute);\n  } else if (this.state.isHierarchicalFacet(attribute)) {\n    return this.state.isHierarchicalFacetRefined(attribute);\n  }\n\n  // there's currently no way to know that the user did call `addNumericRefinement` at some point\n  // thus we cannot distinguish if there once was a numeric refinement that was cleared\n  // so we will return false in every other situations to be consistent\n  // while what we should do here is throw because we did not find the attribute in any type\n  // of refinement\n  return false;\n};\n\n/**\n * Check if a value is excluded for a specific faceted attribute. If the value\n * is omitted then the function checks if there is any excluding refinements.\n *\n * @param  {string}  facet name of the attribute for used for faceting\n * @param  {string}  [value] optional value. If passed will test that this value\n * is filtering the given facet.\n * @return {boolean} true if refined\n * @example\n * helper.isExcludeRefined('color'); // false\n * helper.isExcludeRefined('color', 'blue') // false\n * helper.isExcludeRefined('color', 'red') // false\n *\n * helper.addFacetExclusion('color', 'red');\n *\n * helper.isExcludeRefined('color'); // true\n * helper.isExcludeRefined('color', 'blue') // false\n * helper.isExcludeRefined('color', 'red') // true\n */\nAlgoliaSearchHelper.prototype.isExcluded = function (facet, value) {\n  return this.state.isExcludeRefined(facet, value);\n};\n\n// eslint-disable-next-line valid-jsdoc\n/**\n * @deprecated since 2.4.0, see {@link AlgoliaSearchHelper#hasRefinements}\n */\nAlgoliaSearchHelper.prototype.isDisjunctiveRefined = function (facet, value) {\n  return this.state.isDisjunctiveFacetRefined(facet, value);\n};\n\n/**\n * Check if the string is a currently filtering tag.\n * @param {string} tag tag to check\n * @return {boolean} true if the tag is currently refined\n */\nAlgoliaSearchHelper.prototype.hasTag = function (tag) {\n  return this.state.isTagRefined(tag);\n};\n\n// eslint-disable-next-line valid-jsdoc\n/**\n * @deprecated since 2.4.0, see {@link AlgoliaSearchHelper#hasTag}\n */\nAlgoliaSearchHelper.prototype.isTagRefined = function () {\n  return this.hasTagRefinements.apply(this, arguments);\n};\n\n/**\n * Get the name of the currently used index.\n * @return {string} name of the index\n * @example\n * helper.setIndex('highestPrice_products').getIndex();\n * // returns 'highestPrice_products'\n */\nAlgoliaSearchHelper.prototype.getIndex = function () {\n  return this.state.index;\n};\n\nfunction getCurrentPage() {\n  return this.state.page;\n}\n\n/**\n * Get the currently selected page\n * @deprecated\n * @return {number} the current page\n */\nAlgoliaSearchHelper.prototype.getCurrentPage = getCurrentPage;\n/**\n * Get the currently selected page\n * @function\n * @return {number} the current page\n */\nAlgoliaSearchHelper.prototype.getPage = getCurrentPage;\n\n/**\n * Get all the tags currently set to filters the results.\n *\n * @return {string[]} The list of tags currently set.\n */\nAlgoliaSearchHelper.prototype.getTags = function () {\n  return this.state.tagRefinements;\n};\n\n/**\n * Get the list of refinements for a given attribute. This method works with\n * conjunctive, disjunctive, excluding and numerical filters.\n *\n * See also SearchResults#getRefinements\n *\n * @param {string} facetName attribute name used for faceting\n * @return {Array.<FacetRefinement|NumericRefinement>} All Refinement are objects that contain a value, and\n * a type. Numeric also contains an operator.\n * @example\n * helper.addNumericRefinement('price', '>', 100);\n * helper.getRefinements('price');\n * // [\n * //   {\n * //     \"value\": [\n * //       100\n * //     ],\n * //     \"operator\": \">\",\n * //     \"type\": \"numeric\"\n * //   }\n * // ]\n * @example\n * helper.addFacetRefinement('color', 'blue');\n * helper.addFacetExclusion('color', 'red');\n * helper.getRefinements('color');\n * // [\n * //   {\n * //     \"value\": \"blue\",\n * //     \"type\": \"conjunctive\"\n * //   },\n * //   {\n * //     \"value\": \"red\",\n * //     \"type\": \"exclude\"\n * //   }\n * // ]\n * @example\n * helper.addDisjunctiveFacetRefinement('material', 'plastic');\n * // [\n * //   {\n * //     \"value\": \"plastic\",\n * //     \"type\": \"disjunctive\"\n * //   }\n * // ]\n */\nAlgoliaSearchHelper.prototype.getRefinements = function (facetName) {\n  var refinements = [];\n\n  if (this.state.isConjunctiveFacet(facetName)) {\n    var conjRefinements = this.state.getConjunctiveRefinements(facetName);\n\n    conjRefinements.forEach(function (r) {\n      refinements.push({\n        value: r,\n        type: 'conjunctive',\n      });\n    });\n\n    var excludeRefinements = this.state.getExcludeRefinements(facetName);\n\n    excludeRefinements.forEach(function (r) {\n      refinements.push({\n        value: r,\n        type: 'exclude',\n      });\n    });\n  } else if (this.state.isDisjunctiveFacet(facetName)) {\n    var disjunctiveRefinements =\n      this.state.getDisjunctiveRefinements(facetName);\n\n    disjunctiveRefinements.forEach(function (r) {\n      refinements.push({\n        value: r,\n        type: 'disjunctive',\n      });\n    });\n  }\n\n  var numericRefinements = this.state.getNumericRefinements(facetName);\n\n  Object.keys(numericRefinements).forEach(function (operator) {\n    var value = numericRefinements[operator];\n\n    refinements.push({\n      value: value,\n      operator: operator,\n      type: 'numeric',\n    });\n  });\n\n  return refinements;\n};\n\n/**\n * Return the current refinement for the (attribute, operator)\n * @param {string} attribute attribute in the record\n * @param {string} operator operator applied on the refined values\n * @return {Array.<number|number[]>} refined values\n */\nAlgoliaSearchHelper.prototype.getNumericRefinement = function (\n  attribute,\n  operator\n) {\n  return this.state.getNumericRefinement(attribute, operator);\n};\n\n/**\n * Get the current breadcrumb for a hierarchical facet, as an array\n * @param  {string} facetName Hierarchical facet name\n * @return {array.<string>} the path as an array of string\n */\nAlgoliaSearchHelper.prototype.getHierarchicalFacetBreadcrumb = function (\n  facetName\n) {\n  return this.state.getHierarchicalFacetBreadcrumb(facetName);\n};\n\n// /////////// PRIVATE\n\n/**\n * Perform the underlying queries\n * @private\n * @param {object} options options for the query\n * @param {boolean} [options.onlyWithDerivedHelpers=false] if true, only the derived helpers will be queried\n * @return {undefined} does not return anything\n * @fires search\n * @fires result\n * @fires error\n */\nAlgoliaSearchHelper.prototype._search = function (options) {\n  var state = this.state;\n  var states = [];\n  var mainQueries = [];\n\n  if (!options.onlyWithDerivedHelpers) {\n    mainQueries = requestBuilder._getQueries(state.index, state);\n\n    states.push({\n      state: state,\n      queriesCount: mainQueries.length,\n      helper: this,\n    });\n\n    this.emit('search', {\n      state: state,\n      results: this.lastResults,\n    });\n  }\n\n  var derivedQueries = this.derivedHelpers.map(function (derivedHelper) {\n    var derivedState = derivedHelper.getModifiedState(state);\n    var derivedStateQueries = derivedState.index\n      ? requestBuilder._getQueries(derivedState.index, derivedState)\n      : [];\n\n    states.push({\n      state: derivedState,\n      queriesCount: derivedStateQueries.length,\n      helper: derivedHelper,\n    });\n\n    derivedHelper.emit('search', {\n      state: derivedState,\n      results: derivedHelper.lastResults,\n    });\n\n    return derivedStateQueries;\n  });\n\n  var queries = Array.prototype.concat.apply(mainQueries, derivedQueries);\n\n  var queryId = this._queryId++;\n  this._currentNbQueries++;\n\n  if (!queries.length) {\n    return Promise.resolve({ results: [] }).then(\n      this._dispatchAlgoliaResponse.bind(this, states, queryId)\n    );\n  }\n\n  try {\n    this.client\n      .search(queries)\n      .then(this._dispatchAlgoliaResponse.bind(this, states, queryId))\n      .catch(this._dispatchAlgoliaError.bind(this, queryId));\n  } catch (error) {\n    // If we reach this part, we're in an internal error state\n    this.emit('error', {\n      error: error,\n    });\n  }\n\n  return undefined;\n};\n\n/**\n * Transform the responses as sent by the server and transform them into a user\n * usable object that merge the results of all the batch requests. It will dispatch\n * over the different helper + derived helpers (when there are some).\n * @private\n * @param {array.<{SearchParameters, AlgoliaQueries, AlgoliaSearchHelper}>} states state used to generate the request\n * @param {number} queryId id of the current request\n * @param {object} content content of the response\n * @return {undefined}\n */\nAlgoliaSearchHelper.prototype._dispatchAlgoliaResponse = function (\n  states,\n  queryId,\n  content\n) {\n  // @TODO remove the number of outdated queries discarded instead of just one\n\n  if (queryId < this._lastQueryIdReceived) {\n    // Outdated answer\n    return;\n  }\n\n  this._currentNbQueries -= queryId - this._lastQueryIdReceived;\n  this._lastQueryIdReceived = queryId;\n\n  if (this._currentNbQueries === 0) this.emit('searchQueueEmpty');\n\n  var results = content.results.slice();\n\n  states.forEach(function (s) {\n    var state = s.state;\n    var queriesCount = s.queriesCount;\n    var helper = s.helper;\n    var specificResults = results.splice(0, queriesCount);\n\n    if (!state.index) {\n      helper.emit('result', {\n        results: null,\n        state: state,\n      });\n      return;\n    }\n\n    helper.lastResults = new SearchResults(state, specificResults);\n\n    helper.emit('result', {\n      results: helper.lastResults,\n      state: state,\n    });\n  });\n};\n\nAlgoliaSearchHelper.prototype._dispatchAlgoliaError = function (\n  queryId,\n  error\n) {\n  if (queryId < this._lastQueryIdReceived) {\n    // Outdated answer\n    return;\n  }\n\n  this._currentNbQueries -= queryId - this._lastQueryIdReceived;\n  this._lastQueryIdReceived = queryId;\n\n  this.emit('error', {\n    error: error,\n  });\n\n  if (this._currentNbQueries === 0) this.emit('searchQueueEmpty');\n};\n\nAlgoliaSearchHelper.prototype.containsRefinement = function (\n  query,\n  facetFilters,\n  numericFilters,\n  tagFilters\n) {\n  return (\n    query ||\n    facetFilters.length !== 0 ||\n    numericFilters.length !== 0 ||\n    tagFilters.length !== 0\n  );\n};\n\n/**\n * Test if there are some disjunctive refinements on the facet\n * @private\n * @param {string} facet the attribute to test\n * @return {boolean} true if there are refinements on this attribute\n */\nAlgoliaSearchHelper.prototype._hasDisjunctiveRefinements = function (facet) {\n  return (\n    this.state.disjunctiveRefinements[facet] &&\n    this.state.disjunctiveRefinements[facet].length > 0\n  );\n};\n\nAlgoliaSearchHelper.prototype._change = function (event) {\n  var state = event.state;\n  var isPageReset = event.isPageReset;\n\n  if (state !== this.state) {\n    this.state = state;\n\n    this.emit('change', {\n      state: this.state,\n      results: this.lastResults,\n      isPageReset: isPageReset,\n    });\n  }\n};\n\n/**\n * Clears the cache of the underlying Algolia client.\n * @return {AlgoliaSearchHelper} Method is chainable, it returns itself\n */\nAlgoliaSearchHelper.prototype.clearCache = function () {\n  if (this.client.clearCache) this.client.clearCache();\n  return this;\n};\n\n/**\n * Updates the internal client instance. If the reference of the clients\n * are equal then no update is actually done.\n * @param  {AlgoliaSearch} newClient an AlgoliaSearch client\n * @return {AlgoliaSearchHelper} Method is chainable, it returns itself\n */\nAlgoliaSearchHelper.prototype.setClient = function (newClient) {\n  if (this.client === newClient) return this;\n\n  if (typeof newClient.addAlgoliaAgent === 'function') {\n    newClient.addAlgoliaAgent('JS Helper (' + version + ')');\n  }\n  this.client = newClient;\n\n  return this;\n};\n\n/**\n * Gets the instance of the currently used client.\n * @return {AlgoliaSearch} the currently used client\n */\nAlgoliaSearchHelper.prototype.getClient = function () {\n  return this.client;\n};\n\n/**\n * Creates an derived instance of the Helper. A derived helper\n * is a way to request other indices synchronised with the lifecycle\n * of the main Helper. This mechanism uses the multiqueries feature\n * of Algolia to aggregate all the requests in a single network call.\n *\n * This method takes a function that is used to create a new SearchParameter\n * that will be used to create requests to Algolia. Those new requests\n * are created just before the `search` event. The signature of the function\n * is `SearchParameters -> SearchParameters`.\n *\n * This method returns a new DerivedHelper which is an EventEmitter\n * that fires the same `search`, `result` and `error` events. Those\n * events, however, will receive data specific to this DerivedHelper\n * and the SearchParameters that is returned by the call of the\n * parameter function.\n * @param {function} fn SearchParameters -> SearchParameters\n * @return {DerivedHelper} a new DerivedHelper\n */\nAlgoliaSearchHelper.prototype.derive = function (fn) {\n  var derivedHelper = new DerivedHelper(this, fn);\n  this.derivedHelpers.push(derivedHelper);\n  return derivedHelper;\n};\n\n/**\n * This method detaches a derived Helper from the main one. Prefer using the one from the\n * derived helper itself, to remove the event listeners too.\n * @private\n * @param  {DerivedHelper} derivedHelper the derived helper to detach\n * @return {undefined} nothing is returned\n * @throws Error\n */\nAlgoliaSearchHelper.prototype.detachDerivedHelper = function (derivedHelper) {\n  var pos = this.derivedHelpers.indexOf(derivedHelper);\n  if (pos === -1) throw new Error('Derived helper already detached');\n  this.derivedHelpers.splice(pos, 1);\n};\n\n/**\n * This method returns true if there is currently at least one on-going search.\n * @return {boolean} true if there is a search pending\n */\nAlgoliaSearchHelper.prototype.hasPendingRequests = function () {\n  return this._currentNbQueries > 0;\n};\n\n/**\n * @typedef AlgoliaSearchHelper.NumericRefinement\n * @type {object}\n * @property {number[]} value the numbers that are used for filtering this attribute with\n * the operator specified.\n * @property {string} operator the faceting data: value, number of entries\n * @property {string} type will be 'numeric'\n */\n\n/**\n * @typedef AlgoliaSearchHelper.FacetRefinement\n * @type {object}\n * @property {string} value the string use to filter the attribute\n * @property {string} type the type of filter: 'conjunctive', 'disjunctive', 'exclude'\n */\n\nmodule.exports = AlgoliaSearchHelper;\n","'use strict';\n\nmodule.exports = function compact(array) {\n  if (!Array.isArray(array)) {\n    return [];\n  }\n\n  return array.filter(Boolean);\n};\n","'use strict';\n\n// NOTE: this behaves like lodash/defaults, but doesn't mutate the target\n// it also preserve keys order\nmodule.exports = function defaultsPure() {\n  var sources = Array.prototype.slice.call(arguments);\n\n  return sources.reduceRight(function (acc, source) {\n    Object.keys(Object(source)).forEach(function (key) {\n      if (source[key] === undefined) {\n        return;\n      }\n      if (acc[key] !== undefined) {\n        // remove if already added, so that we can add it in correct order\n        delete acc[key];\n      }\n      acc[key] = source[key];\n    });\n    return acc;\n  }, {});\n};\n","'use strict';\n\n/**\n * Replaces a leading - with \\-\n * @private\n * @param {any} value the facet value to replace\n * @returns {any} the escaped facet value or the value if it was not a string\n */\nfunction escapeFacetValue(value) {\n  if (typeof value !== 'string') return value;\n\n  return String(value).replace(/^-/, '\\\\-');\n}\n\n/**\n * Replaces a leading \\- with -\n * @private\n * @param {any} value the escaped facet value\n * @returns {any} the unescaped facet value or the value if it was not a string\n */\nfunction unescapeFacetValue(value) {\n  if (typeof value !== 'string') return value;\n\n  return value.replace(/^\\\\-/, '-');\n}\n\nmodule.exports = {\n  escapeFacetValue: escapeFacetValue,\n  unescapeFacetValue: unescapeFacetValue,\n};\n","'use strict';\n\n// @MAJOR can be replaced by native Array#find when we change support\nmodule.exports = function find(array, comparator) {\n  if (!Array.isArray(array)) {\n    return undefined;\n  }\n\n  for (var i = 0; i < array.length; i++) {\n    if (comparator(array[i])) {\n      return array[i];\n    }\n  }\n\n  return undefined;\n};\n","'use strict';\n\n// @MAJOR can be replaced by native Array#findIndex when we change support\nmodule.exports = function find(array, comparator) {\n  if (!Array.isArray(array)) {\n    return -1;\n  }\n\n  for (var i = 0; i < array.length; i++) {\n    if (comparator(array[i])) {\n      return i;\n    }\n  }\n  return -1;\n};\n","'use strict';\n\nvar find = require('./find');\n\n/**\n * Transform sort format from user friendly notation to lodash format\n * @param {string[]} sortBy array of predicate of the form \"attribute:order\"\n * @param {string[]} [defaults] array of predicate of the form \"attribute:order\"\n * @return {array.<string[]>} array containing 2 elements : attributes, orders\n */\nmodule.exports = function formatSort(sortBy, defaults) {\n  var defaultInstructions = (defaults || []).map(function (sort) {\n    return sort.split(':');\n  });\n\n  return sortBy.reduce(\n    function preparePredicate(out, sort) {\n      var sortInstruction = sort.split(':');\n\n      var matchingDefault = find(\n        defaultInstructions,\n        function (defaultInstruction) {\n          return defaultInstruction[0] === sortInstruction[0];\n        }\n      );\n\n      if (sortInstruction.length > 1 || !matchingDefault) {\n        out[0].push(sortInstruction[0]);\n        out[1].push(sortInstruction[1]);\n        return out;\n      }\n\n      out[0].push(matchingDefault[0]);\n      out[1].push(matchingDefault[1]);\n      return out;\n    },\n    [[], []]\n  );\n};\n","'use strict';\n\nfunction inherits(ctor, superCtor) {\n  ctor.prototype = Object.create(superCtor.prototype, {\n    constructor: {\n      value: ctor,\n      enumerable: false,\n      writable: true,\n      configurable: true,\n    },\n  });\n}\n\nmodule.exports = inherits;\n","'use strict';\n\nfunction intersection(arr1, arr2) {\n  return arr1.filter(function (value, index) {\n    return (\n      arr2.indexOf(value) > -1 &&\n      arr1.indexOf(value) === index /* skips duplicates */\n    );\n  });\n}\n\nmodule.exports = intersection;\n","'use strict';\n\nfunction clone(value) {\n  if (typeof value === 'object' && value !== null) {\n    return _merge(Array.isArray(value) ? [] : {}, value);\n  }\n  return value;\n}\n\nfunction isObjectOrArrayOrFunction(value) {\n  return (\n    typeof value === 'function' ||\n    Array.isArray(value) ||\n    Object.prototype.toString.call(value) === '[object Object]'\n  );\n}\n\nfunction _merge(target, source) {\n  if (target === source) {\n    return target;\n  }\n\n  // eslint-disable-next-line no-restricted-syntax\n  for (var key in source) {\n    if (\n      !Object.prototype.hasOwnProperty.call(source, key) ||\n      key === '__proto__' ||\n      key === 'constructor'\n    ) {\n      // eslint-disable-next-line no-continue\n      continue;\n    }\n\n    var sourceVal = source[key];\n    var targetVal = target[key];\n\n    if (typeof targetVal !== 'undefined' && typeof sourceVal === 'undefined') {\n      // eslint-disable-next-line no-continue\n      continue;\n    }\n\n    if (\n      isObjectOrArrayOrFunction(targetVal) &&\n      isObjectOrArrayOrFunction(sourceVal)\n    ) {\n      target[key] = _merge(targetVal, sourceVal);\n    } else {\n      target[key] = clone(sourceVal);\n    }\n  }\n  return target;\n}\n\n/**\n * This method is like Object.assign, but recursively merges own and inherited\n * enumerable keyed properties of source objects into the destination object.\n *\n * NOTE: this behaves like lodash/merge, but:\n * - does mutate functions if they are a source\n * - treats non-plain objects as plain\n * - does not work for circular objects\n * - treats sparse arrays as sparse\n * - does not convert Array-like objects (Arguments, NodeLists, etc.) to arrays\n *\n * @param {Object} target The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n */\nfunction merge(target) {\n  if (!isObjectOrArrayOrFunction(target)) {\n    target = {};\n  }\n\n  for (var i = 1, l = arguments.length; i < l; i++) {\n    var source = arguments[i];\n\n    if (isObjectOrArrayOrFunction(source)) {\n      _merge(target, source);\n    }\n  }\n  return target;\n}\n\nmodule.exports = merge;\n","'use strict';\n\nfunction objectHasKeys(obj) {\n  return obj && Object.keys(obj).length > 0;\n}\n\nmodule.exports = objectHasKeys;\n","'use strict';\n\n// https://github.com/babel/babel/blob/3aaafae053fa75febb3aa45d45b6f00646e30ba4/packages/babel-helpers/src/helpers.js#L604-L620\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n  if (source === null) return {};\n  var target = {};\n  var sourceKeys = Object.keys(source);\n  var key;\n  var i;\n  for (i = 0; i < sourceKeys.length; i++) {\n    key = sourceKeys[i];\n    // eslint-disable-next-line no-continue\n    if (excluded.indexOf(key) >= 0) continue;\n    target[key] = source[key];\n  }\n  return target;\n}\n\nmodule.exports = _objectWithoutPropertiesLoose;\n","'use strict';\n\nfunction compareAscending(value, other) {\n  if (value !== other) {\n    var valIsDefined = value !== undefined;\n    var valIsNull = value === null;\n\n    var othIsDefined = other !== undefined;\n    var othIsNull = other === null;\n\n    if (\n      (!othIsNull && value > other) ||\n      (valIsNull && othIsDefined) ||\n      !valIsDefined\n    ) {\n      return 1;\n    }\n    if (\n      (!valIsNull && value < other) ||\n      (othIsNull && valIsDefined) ||\n      !othIsDefined\n    ) {\n      return -1;\n    }\n  }\n  return 0;\n}\n\n/**\n * @param {Array<object>} collection object with keys in attributes\n * @param {Array<string>} iteratees attributes\n * @param {Array<string>} orders asc | desc\n * @return {Array<object>} sorted collection\n */\nfunction orderBy(collection, iteratees, orders) {\n  if (!Array.isArray(collection)) {\n    return [];\n  }\n\n  if (!Array.isArray(orders)) {\n    orders = [];\n  }\n\n  var result = collection.map(function (value, index) {\n    return {\n      criteria: iteratees.map(function (iteratee) {\n        return value[iteratee];\n      }),\n      index: index,\n      value: value,\n    };\n  });\n\n  result.sort(function comparer(object, other) {\n    var index = -1;\n\n    while (++index < object.criteria.length) {\n      var res = compareAscending(object.criteria[index], other.criteria[index]);\n      if (res) {\n        if (index >= orders.length) {\n          return res;\n        }\n        if (orders[index] === 'desc') {\n          return -res;\n        }\n        return res;\n      }\n    }\n\n    // This ensures a stable sort in V8 and other engines.\n    // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.\n    return object.index - other.index;\n  });\n\n  return result.map(function (res) {\n    return res.value;\n  });\n}\n\nmodule.exports = orderBy;\n","'use strict';\n\nfunction valToNumber(v) {\n  if (typeof v === 'number') {\n    return v;\n  } else if (typeof v === 'string') {\n    return parseFloat(v);\n  } else if (Array.isArray(v)) {\n    return v.map(valToNumber);\n  }\n\n  throw new Error(\n    'The value should be a number, a parsable string or an array of those.'\n  );\n}\n\nmodule.exports = valToNumber;\n","'use strict';\n\nvar merge = require('./functions/merge');\n\nfunction sortObject(obj) {\n  return Object.keys(obj)\n    .sort()\n    .reduce(function (acc, curr) {\n      acc[curr] = obj[curr];\n      return acc;\n    }, {});\n}\n\nvar requestBuilder = {\n  /**\n   * Get all the queries to send to the client, those queries can used directly\n   * with the Algolia client.\n   * @private\n   * @param  {string} index The name of the index\n   * @param  {SearchParameters} state The state from which to get the queries\n   * @return {object[]} The queries\n   */\n  _getQueries: function getQueries(index, state) {\n    var queries = [];\n\n    // One query for the hits\n    queries.push({\n      indexName: index,\n      params: requestBuilder._getHitsSearchParams(state),\n    });\n\n    // One for each disjunctive facets\n    state.getRefinedDisjunctiveFacets().forEach(function (refinedFacet) {\n      queries.push({\n        indexName: index,\n        params: requestBuilder._getDisjunctiveFacetSearchParams(\n          state,\n          refinedFacet\n        ),\n      });\n    });\n\n    // More to get the parent levels of the hierarchical facets when refined\n    state.getRefinedHierarchicalFacets().forEach(function (refinedFacet) {\n      var hierarchicalFacet = state.getHierarchicalFacetByName(refinedFacet);\n      var currentRefinement = state.getHierarchicalRefinement(refinedFacet);\n      var separator = state._getHierarchicalFacetSeparator(hierarchicalFacet);\n\n      // If we are deeper than level 0 (starting from `beer > IPA`)\n      // we want to get all parent values\n      if (\n        currentRefinement.length > 0 &&\n        currentRefinement[0].split(separator).length > 1\n      ) {\n        // We generate a map of the filters we will use for our facet values queries\n        var filtersMap = currentRefinement[0]\n          .split(separator)\n          .slice(0, -1)\n          .reduce(function createFiltersMap(map, segment, level) {\n            return map.concat({\n              attribute: hierarchicalFacet.attributes[level],\n              value:\n                level === 0\n                  ? segment\n                  : [map[map.length - 1].value, segment].join(separator),\n            });\n          }, []);\n\n        filtersMap.forEach(function (filter, level) {\n          var params = requestBuilder._getDisjunctiveFacetSearchParams(\n            state,\n            filter.attribute,\n            level === 0\n          );\n\n          // Keep facet filters unrelated to current hierarchical attributes\n          function hasHierarchicalFacetFilter(value) {\n            return hierarchicalFacet.attributes.some(function (attribute) {\n              return attribute === value.split(':')[0];\n            });\n          }\n\n          var filteredFacetFilters = (params.facetFilters || []).reduce(\n            function (acc, facetFilter) {\n              if (Array.isArray(facetFilter)) {\n                var filtered = facetFilter.filter(function (filterValue) {\n                  return !hasHierarchicalFacetFilter(filterValue);\n                });\n\n                if (filtered.length > 0) {\n                  acc.push(filtered);\n                }\n              }\n\n              if (\n                typeof facetFilter === 'string' &&\n                !hasHierarchicalFacetFilter(facetFilter)\n              ) {\n                acc.push(facetFilter);\n              }\n\n              return acc;\n            },\n            []\n          );\n\n          var parent = filtersMap[level - 1];\n          if (level > 0) {\n            params.facetFilters = filteredFacetFilters.concat(\n              parent.attribute + ':' + parent.value\n            );\n          } else {\n            params.facetFilters =\n              filteredFacetFilters.length > 0\n                ? filteredFacetFilters\n                : undefined;\n          }\n\n          queries.push({ indexName: index, params: params });\n        });\n      }\n    });\n\n    return queries;\n  },\n\n  /**\n   * Build search parameters used to fetch hits\n   * @private\n   * @param  {SearchParameters} state The state from which to get the queries\n   * @return {object.<string, any>} The search parameters for hits\n   */\n  _getHitsSearchParams: function (state) {\n    var facets = state.facets\n      .concat(state.disjunctiveFacets)\n      .concat(requestBuilder._getHitsHierarchicalFacetsAttributes(state))\n      .sort();\n\n    var facetFilters = requestBuilder._getFacetFilters(state);\n    var numericFilters = requestBuilder._getNumericFilters(state);\n    var tagFilters = requestBuilder._getTagFilters(state);\n    var additionalParams = {\n      facets: facets.indexOf('*') > -1 ? ['*'] : facets,\n      tagFilters: tagFilters,\n    };\n\n    if (facetFilters.length > 0) {\n      additionalParams.facetFilters = facetFilters;\n    }\n\n    if (numericFilters.length > 0) {\n      additionalParams.numericFilters = numericFilters;\n    }\n\n    return sortObject(merge({}, state.getQueryParams(), additionalParams));\n  },\n\n  /**\n   * Build search parameters used to fetch a disjunctive facet\n   * @private\n   * @param  {SearchParameters} state The state from which to get the queries\n   * @param  {string} facet the associated facet name\n   * @param  {boolean} hierarchicalRootLevel ?? FIXME\n   * @return {object} The search parameters for a disjunctive facet\n   */\n  _getDisjunctiveFacetSearchParams: function (\n    state,\n    facet,\n    hierarchicalRootLevel\n  ) {\n    var facetFilters = requestBuilder._getFacetFilters(\n      state,\n      facet,\n      hierarchicalRootLevel\n    );\n    var numericFilters = requestBuilder._getNumericFilters(state, facet);\n    var tagFilters = requestBuilder._getTagFilters(state);\n    var additionalParams = {\n      hitsPerPage: 0,\n      page: 0,\n      analytics: false,\n      clickAnalytics: false,\n    };\n\n    if (tagFilters.length > 0) {\n      additionalParams.tagFilters = tagFilters;\n    }\n\n    var hierarchicalFacet = state.getHierarchicalFacetByName(facet);\n\n    if (hierarchicalFacet) {\n      additionalParams.facets =\n        requestBuilder._getDisjunctiveHierarchicalFacetAttribute(\n          state,\n          hierarchicalFacet,\n          hierarchicalRootLevel\n        );\n    } else {\n      additionalParams.facets = facet;\n    }\n\n    if (numericFilters.length > 0) {\n      additionalParams.numericFilters = numericFilters;\n    }\n\n    if (facetFilters.length > 0) {\n      additionalParams.facetFilters = facetFilters;\n    }\n\n    return sortObject(merge({}, state.getQueryParams(), additionalParams));\n  },\n\n  /**\n   * Return the numeric filters in an algolia request fashion\n   * @private\n   * @param {SearchParameters} state the state from which to get the filters\n   * @param {string} [facetName] the name of the attribute for which the filters should be excluded\n   * @return {string[]} the numeric filters in the algolia format\n   */\n  _getNumericFilters: function (state, facetName) {\n    if (state.numericFilters) {\n      return state.numericFilters;\n    }\n\n    var numericFilters = [];\n\n    Object.keys(state.numericRefinements).forEach(function (attribute) {\n      var operators = state.numericRefinements[attribute] || {};\n      Object.keys(operators).forEach(function (operator) {\n        var values = operators[operator] || [];\n        if (facetName !== attribute) {\n          values.forEach(function (value) {\n            if (Array.isArray(value)) {\n              var vs = value.map(function (v) {\n                return attribute + operator + v;\n              });\n              numericFilters.push(vs);\n            } else {\n              numericFilters.push(attribute + operator + value);\n            }\n          });\n        }\n      });\n    });\n\n    return numericFilters;\n  },\n\n  /**\n   * Return the tags filters depending on which format is used, either tagFilters or tagRefinements\n   * @private\n   * @param {SearchParameters} state the state from which to get the filters\n   * @return {string} Tag filters in a single string\n   */\n  _getTagFilters: function (state) {\n    if (state.tagFilters) {\n      return state.tagFilters;\n    }\n\n    return state.tagRefinements.join(',');\n  },\n\n  /**\n   * Build facetFilters parameter based on current refinements. The array returned\n   * contains strings representing the facet filters in the algolia format.\n   * @private\n   * @param  {SearchParameters} state The state from which to get the queries\n   * @param  {string} [facet] if set, the current disjunctive facet\n   * @param  {boolean} [hierarchicalRootLevel] ?? FIXME\n   * @return {array.<string>} The facet filters in the algolia format\n   */\n  _getFacetFilters: function (state, facet, hierarchicalRootLevel) {\n    var facetFilters = [];\n\n    var facetsRefinements = state.facetsRefinements || {};\n    Object.keys(facetsRefinements)\n      .sort()\n      .forEach(function (facetName) {\n        var facetValues = facetsRefinements[facetName] || [];\n        facetValues.sort().forEach(function (facetValue) {\n          facetFilters.push(facetName + ':' + facetValue);\n        });\n      });\n\n    var facetsExcludes = state.facetsExcludes || {};\n    Object.keys(facetsExcludes)\n      .sort()\n      .forEach(function (facetName) {\n        var facetValues = facetsExcludes[facetName] || [];\n        facetValues.sort().forEach(function (facetValue) {\n          facetFilters.push(facetName + ':-' + facetValue);\n        });\n      });\n\n    var disjunctiveFacetsRefinements = state.disjunctiveFacetsRefinements || {};\n    Object.keys(disjunctiveFacetsRefinements)\n      .sort()\n      .forEach(function (facetName) {\n        var facetValues = disjunctiveFacetsRefinements[facetName] || [];\n        if (facetName === facet || !facetValues || facetValues.length === 0) {\n          return;\n        }\n        var orFilters = [];\n\n        facetValues.sort().forEach(function (facetValue) {\n          orFilters.push(facetName + ':' + facetValue);\n        });\n\n        facetFilters.push(orFilters);\n      });\n\n    var hierarchicalFacetsRefinements =\n      state.hierarchicalFacetsRefinements || {};\n    Object.keys(hierarchicalFacetsRefinements)\n      .sort()\n      .forEach(function (facetName) {\n        var facetValues = hierarchicalFacetsRefinements[facetName] || [];\n        var facetValue = facetValues[0];\n\n        if (facetValue === undefined) {\n          return;\n        }\n\n        var hierarchicalFacet = state.getHierarchicalFacetByName(facetName);\n        var separator = state._getHierarchicalFacetSeparator(hierarchicalFacet);\n        var rootPath = state._getHierarchicalRootPath(hierarchicalFacet);\n        var attributeToRefine;\n        var attributesIndex;\n\n        // we ask for parent facet values only when the `facet` is the current hierarchical facet\n        if (facet === facetName) {\n          // if we are at the root level already, no need to ask for facet values, we get them from\n          // the hits query\n          if (\n            facetValue.indexOf(separator) === -1 ||\n            (!rootPath && hierarchicalRootLevel === true) ||\n            (rootPath &&\n              rootPath.split(separator).length ===\n                facetValue.split(separator).length)\n          ) {\n            return;\n          }\n\n          if (!rootPath) {\n            attributesIndex = facetValue.split(separator).length - 2;\n            facetValue = facetValue.slice(0, facetValue.lastIndexOf(separator));\n          } else {\n            attributesIndex = rootPath.split(separator).length - 1;\n            facetValue = rootPath;\n          }\n\n          attributeToRefine = hierarchicalFacet.attributes[attributesIndex];\n        } else {\n          attributesIndex = facetValue.split(separator).length - 1;\n\n          attributeToRefine = hierarchicalFacet.attributes[attributesIndex];\n        }\n\n        if (attributeToRefine) {\n          facetFilters.push([attributeToRefine + ':' + facetValue]);\n        }\n      });\n\n    return facetFilters;\n  },\n\n  _getHitsHierarchicalFacetsAttributes: function (state) {\n    var out = [];\n\n    return state.hierarchicalFacets.reduce(\n      // ask for as much levels as there's hierarchical refinements\n      function getHitsAttributesForHierarchicalFacet(\n        allAttributes,\n        hierarchicalFacet\n      ) {\n        var hierarchicalRefinement = state.getHierarchicalRefinement(\n          hierarchicalFacet.name\n        )[0];\n\n        // if no refinement, ask for root level\n        if (!hierarchicalRefinement) {\n          allAttributes.push(hierarchicalFacet.attributes[0]);\n          return allAttributes;\n        }\n\n        var separator = state._getHierarchicalFacetSeparator(hierarchicalFacet);\n        var level = hierarchicalRefinement.split(separator).length;\n        var newAttributes = hierarchicalFacet.attributes.slice(0, level + 1);\n\n        return allAttributes.concat(newAttributes);\n      },\n      out\n    );\n  },\n\n  _getDisjunctiveHierarchicalFacetAttribute: function (\n    state,\n    hierarchicalFacet,\n    rootLevel\n  ) {\n    var separator = state._getHierarchicalFacetSeparator(hierarchicalFacet);\n    if (rootLevel === true) {\n      var rootPath = state._getHierarchicalRootPath(hierarchicalFacet);\n      var attributeIndex = 0;\n\n      if (rootPath) {\n        attributeIndex = rootPath.split(separator).length;\n      }\n      return [hierarchicalFacet.attributes[attributeIndex]];\n    }\n\n    var hierarchicalRefinement =\n      state.getHierarchicalRefinement(hierarchicalFacet.name)[0] || '';\n    // if refinement is 'beers > IPA > Flying dog',\n    // then we want `facets: ['beers > IPA']` as disjunctive facet (parent level values)\n\n    var parentLevel = hierarchicalRefinement.split(separator).length - 1;\n    return hierarchicalFacet.attributes.slice(0, parentLevel + 1);\n  },\n\n  getSearchForFacetQuery: function (facetName, query, maxFacetHits, state) {\n    var stateForSearchForFacetValues = state.isDisjunctiveFacet(facetName)\n      ? state.clearRefinements(facetName)\n      : state;\n    var searchForFacetSearchParameters = {\n      facetQuery: query,\n      facetName: facetName,\n    };\n    if (typeof maxFacetHits === 'number') {\n      searchForFacetSearchParameters.maxFacetHits = maxFacetHits;\n    }\n    return sortObject(\n      merge(\n        {},\n        requestBuilder._getHitsSearchParams(stateForSearchForFacetValues),\n        searchForFacetSearchParameters\n      )\n    );\n  },\n};\n\nmodule.exports = requestBuilder;\n","'use strict';\n\nmodule.exports = function isValidUserToken(userToken) {\n  if (userToken === null) {\n    return false;\n  }\n  return /^[a-zA-Z0-9_-]{1,64}$/.test(userToken);\n};\n","'use strict';\n\nmodule.exports = '3.14.2';\n","'use strict';\n\nvar replace = String.prototype.replace;\nvar percentTwenties = /%20/g;\n\nvar Format = {\n    RFC1738: 'RFC1738',\n    RFC3986: 'RFC3986'\n};\n\nmodule.exports = {\n    'default': Format.RFC3986,\n    formatters: {\n        RFC1738: function (value) {\n            return replace.call(value, percentTwenties, '+');\n        },\n        RFC3986: function (value) {\n            return String(value);\n        }\n    },\n    RFC1738: Format.RFC1738,\n    RFC3986: Format.RFC3986\n};\n","'use strict';\n\nvar stringify = require('./stringify');\nvar parse = require('./parse');\nvar formats = require('./formats');\n\nmodule.exports = {\n    formats: formats,\n    parse: parse,\n    stringify: stringify\n};\n","'use strict';\n\nvar utils = require('./utils');\n\nvar has = Object.prototype.hasOwnProperty;\nvar isArray = Array.isArray;\n\nvar defaults = {\n    allowDots: false,\n    allowPrototypes: false,\n    arrayLimit: 20,\n    charset: 'utf-8',\n    charsetSentinel: false,\n    comma: false,\n    decoder: utils.decode,\n    delimiter: '&',\n    depth: 5,\n    ignoreQueryPrefix: false,\n    interpretNumericEntities: false,\n    parameterLimit: 1000,\n    parseArrays: true,\n    plainObjects: false,\n    strictNullHandling: false\n};\n\nvar interpretNumericEntities = function (str) {\n    return str.replace(/&#(\\d+);/g, function ($0, numberStr) {\n        return String.fromCharCode(parseInt(numberStr, 10));\n    });\n};\n\nvar parseArrayValue = function (val, options) {\n    if (val && typeof val === 'string' && options.comma && val.indexOf(',') > -1) {\n        return val.split(',');\n    }\n\n    return val;\n};\n\n// This is what browsers will submit when the ✓ character occurs in an\n// application/x-www-form-urlencoded body and the encoding of the page containing\n// the form is iso-8859-1, or when the submitted form has an accept-charset\n// attribute of iso-8859-1. Presumably also with other charsets that do not contain\n// the ✓ character, such as us-ascii.\nvar isoSentinel = 'utf8=%26%2310003%3B'; // encodeURIComponent('&#10003;')\n\n// These are the percent-encoded utf-8 octets representing a checkmark, indicating that the request actually is utf-8 encoded.\nvar charsetSentinel = 'utf8=%E2%9C%93'; // encodeURIComponent('✓')\n\nvar parseValues = function parseQueryStringValues(str, options) {\n    var obj = {};\n    var cleanStr = options.ignoreQueryPrefix ? str.replace(/^\\?/, '') : str;\n    var limit = options.parameterLimit === Infinity ? undefined : options.parameterLimit;\n    var parts = cleanStr.split(options.delimiter, limit);\n    var skipIndex = -1; // Keep track of where the utf8 sentinel was found\n    var i;\n\n    var charset = options.charset;\n    if (options.charsetSentinel) {\n        for (i = 0; i < parts.length; ++i) {\n            if (parts[i].indexOf('utf8=') === 0) {\n                if (parts[i] === charsetSentinel) {\n                    charset = 'utf-8';\n                } else if (parts[i] === isoSentinel) {\n                    charset = 'iso-8859-1';\n                }\n                skipIndex = i;\n                i = parts.length; // The eslint settings do not allow break;\n            }\n        }\n    }\n\n    for (i = 0; i < parts.length; ++i) {\n        if (i === skipIndex) {\n            continue;\n        }\n        var part = parts[i];\n\n        var bracketEqualsPos = part.indexOf(']=');\n        var pos = bracketEqualsPos === -1 ? part.indexOf('=') : bracketEqualsPos + 1;\n\n        var key, val;\n        if (pos === -1) {\n            key = options.decoder(part, defaults.decoder, charset, 'key');\n            val = options.strictNullHandling ? null : '';\n        } else {\n            key = options.decoder(part.slice(0, pos), defaults.decoder, charset, 'key');\n            val = utils.maybeMap(\n                parseArrayValue(part.slice(pos + 1), options),\n                function (encodedVal) {\n                    return options.decoder(encodedVal, defaults.decoder, charset, 'value');\n                }\n            );\n        }\n\n        if (val && options.interpretNumericEntities && charset === 'iso-8859-1') {\n            val = interpretNumericEntities(val);\n        }\n\n        if (part.indexOf('[]=') > -1) {\n            val = isArray(val) ? [val] : val;\n        }\n\n        if (has.call(obj, key)) {\n            obj[key] = utils.combine(obj[key], val);\n        } else {\n            obj[key] = val;\n        }\n    }\n\n    return obj;\n};\n\nvar parseObject = function (chain, val, options, valuesParsed) {\n    var leaf = valuesParsed ? val : parseArrayValue(val, options);\n\n    for (var i = chain.length - 1; i >= 0; --i) {\n        var obj;\n        var root = chain[i];\n\n        if (root === '[]' && options.parseArrays) {\n            obj = [].concat(leaf);\n        } else {\n            obj = options.plainObjects ? Object.create(null) : {};\n            var cleanRoot = root.charAt(0) === '[' && root.charAt(root.length - 1) === ']' ? root.slice(1, -1) : root;\n            var index = parseInt(cleanRoot, 10);\n            if (!options.parseArrays && cleanRoot === '') {\n                obj = { 0: leaf };\n            } else if (\n                !isNaN(index)\n                && root !== cleanRoot\n                && String(index) === cleanRoot\n                && index >= 0\n                && (options.parseArrays && index <= options.arrayLimit)\n            ) {\n                obj = [];\n                obj[index] = leaf;\n            } else if (cleanRoot !== '__proto__') {\n                obj[cleanRoot] = leaf;\n            }\n        }\n\n        leaf = obj;\n    }\n\n    return leaf;\n};\n\nvar parseKeys = function parseQueryStringKeys(givenKey, val, options, valuesParsed) {\n    if (!givenKey) {\n        return;\n    }\n\n    // Transform dot notation to bracket notation\n    var key = options.allowDots ? givenKey.replace(/\\.([^.[]+)/g, '[$1]') : givenKey;\n\n    // The regex chunks\n\n    var brackets = /(\\[[^[\\]]*])/;\n    var child = /(\\[[^[\\]]*])/g;\n\n    // Get the parent\n\n    var segment = options.depth > 0 && brackets.exec(key);\n    var parent = segment ? key.slice(0, segment.index) : key;\n\n    // Stash the parent if it exists\n\n    var keys = [];\n    if (parent) {\n        // If we aren't using plain objects, optionally prefix keys that would overwrite object prototype properties\n        if (!options.plainObjects && has.call(Object.prototype, parent)) {\n            if (!options.allowPrototypes) {\n                return;\n            }\n        }\n\n        keys.push(parent);\n    }\n\n    // Loop through children appending to the array until we hit depth\n\n    var i = 0;\n    while (options.depth > 0 && (segment = child.exec(key)) !== null && i < options.depth) {\n        i += 1;\n        if (!options.plainObjects && has.call(Object.prototype, segment[1].slice(1, -1))) {\n            if (!options.allowPrototypes) {\n                return;\n            }\n        }\n        keys.push(segment[1]);\n    }\n\n    // If there's a remainder, just add whatever is left\n\n    if (segment) {\n        keys.push('[' + key.slice(segment.index) + ']');\n    }\n\n    return parseObject(keys, val, options, valuesParsed);\n};\n\nvar normalizeParseOptions = function normalizeParseOptions(opts) {\n    if (!opts) {\n        return defaults;\n    }\n\n    if (opts.decoder !== null && opts.decoder !== undefined && typeof opts.decoder !== 'function') {\n        throw new TypeError('Decoder has to be a function.');\n    }\n\n    if (typeof opts.charset !== 'undefined' && opts.charset !== 'utf-8' && opts.charset !== 'iso-8859-1') {\n        throw new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined');\n    }\n    var charset = typeof opts.charset === 'undefined' ? defaults.charset : opts.charset;\n\n    return {\n        allowDots: typeof opts.allowDots === 'undefined' ? defaults.allowDots : !!opts.allowDots,\n        allowPrototypes: typeof opts.allowPrototypes === 'boolean' ? opts.allowPrototypes : defaults.allowPrototypes,\n        arrayLimit: typeof opts.arrayLimit === 'number' ? opts.arrayLimit : defaults.arrayLimit,\n        charset: charset,\n        charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults.charsetSentinel,\n        comma: typeof opts.comma === 'boolean' ? opts.comma : defaults.comma,\n        decoder: typeof opts.decoder === 'function' ? opts.decoder : defaults.decoder,\n        delimiter: typeof opts.delimiter === 'string' || utils.isRegExp(opts.delimiter) ? opts.delimiter : defaults.delimiter,\n        // eslint-disable-next-line no-implicit-coercion, no-extra-parens\n        depth: (typeof opts.depth === 'number' || opts.depth === false) ? +opts.depth : defaults.depth,\n        ignoreQueryPrefix: opts.ignoreQueryPrefix === true,\n        interpretNumericEntities: typeof opts.interpretNumericEntities === 'boolean' ? opts.interpretNumericEntities : defaults.interpretNumericEntities,\n        parameterLimit: typeof opts.parameterLimit === 'number' ? opts.parameterLimit : defaults.parameterLimit,\n        parseArrays: opts.parseArrays !== false,\n        plainObjects: typeof opts.plainObjects === 'boolean' ? opts.plainObjects : defaults.plainObjects,\n        strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults.strictNullHandling\n    };\n};\n\nmodule.exports = function (str, opts) {\n    var options = normalizeParseOptions(opts);\n\n    if (str === '' || str === null || typeof str === 'undefined') {\n        return options.plainObjects ? Object.create(null) : {};\n    }\n\n    var tempObj = typeof str === 'string' ? parseValues(str, options) : str;\n    var obj = options.plainObjects ? Object.create(null) : {};\n\n    // Iterate over the keys and setup the new object\n\n    var keys = Object.keys(tempObj);\n    for (var i = 0; i < keys.length; ++i) {\n        var key = keys[i];\n        var newObj = parseKeys(key, tempObj[key], options, typeof str === 'string');\n        obj = utils.merge(obj, newObj, options);\n    }\n\n    return utils.compact(obj);\n};\n","'use strict';\n\nvar utils = require('./utils');\nvar formats = require('./formats');\nvar has = Object.prototype.hasOwnProperty;\n\nvar arrayPrefixGenerators = {\n    brackets: function brackets(prefix) {\n        return prefix + '[]';\n    },\n    comma: 'comma',\n    indices: function indices(prefix, key) {\n        return prefix + '[' + key + ']';\n    },\n    repeat: function repeat(prefix) {\n        return prefix;\n    }\n};\n\nvar isArray = Array.isArray;\nvar split = String.prototype.split;\nvar push = Array.prototype.push;\nvar pushToArray = function (arr, valueOrArray) {\n    push.apply(arr, isArray(valueOrArray) ? valueOrArray : [valueOrArray]);\n};\n\nvar toISO = Date.prototype.toISOString;\n\nvar defaultFormat = formats['default'];\nvar defaults = {\n    addQueryPrefix: false,\n    allowDots: false,\n    charset: 'utf-8',\n    charsetSentinel: false,\n    delimiter: '&',\n    encode: true,\n    encoder: utils.encode,\n    encodeValuesOnly: false,\n    format: defaultFormat,\n    formatter: formats.formatters[defaultFormat],\n    // deprecated\n    indices: false,\n    serializeDate: function serializeDate(date) {\n        return toISO.call(date);\n    },\n    skipNulls: false,\n    strictNullHandling: false\n};\n\nvar isNonNullishPrimitive = function isNonNullishPrimitive(v) {\n    return typeof v === 'string'\n        || typeof v === 'number'\n        || typeof v === 'boolean'\n        || typeof v === 'symbol'\n        || typeof v === 'bigint';\n};\n\nvar stringify = function stringify(\n    object,\n    prefix,\n    generateArrayPrefix,\n    strictNullHandling,\n    skipNulls,\n    encoder,\n    filter,\n    sort,\n    allowDots,\n    serializeDate,\n    format,\n    formatter,\n    encodeValuesOnly,\n    charset\n) {\n    var obj = object;\n    if (typeof filter === 'function') {\n        obj = filter(prefix, obj);\n    } else if (obj instanceof Date) {\n        obj = serializeDate(obj);\n    } else if (generateArrayPrefix === 'comma' && isArray(obj)) {\n        obj = utils.maybeMap(obj, function (value) {\n            if (value instanceof Date) {\n                return serializeDate(value);\n            }\n            return value;\n        });\n    }\n\n    if (obj === null) {\n        if (strictNullHandling) {\n            return encoder && !encodeValuesOnly ? encoder(prefix, defaults.encoder, charset, 'key', format) : prefix;\n        }\n\n        obj = '';\n    }\n\n    if (isNonNullishPrimitive(obj) || utils.isBuffer(obj)) {\n        if (encoder) {\n            var keyValue = encodeValuesOnly ? prefix : encoder(prefix, defaults.encoder, charset, 'key', format);\n            if (generateArrayPrefix === 'comma' && encodeValuesOnly) {\n                var valuesArray = split.call(String(obj), ',');\n                var valuesJoined = '';\n                for (var i = 0; i < valuesArray.length; ++i) {\n                    valuesJoined += (i === 0 ? '' : ',') + formatter(encoder(valuesArray[i], defaults.encoder, charset, 'value', format));\n                }\n                return [formatter(keyValue) + '=' + valuesJoined];\n            }\n            return [formatter(keyValue) + '=' + formatter(encoder(obj, defaults.encoder, charset, 'value', format))];\n        }\n        return [formatter(prefix) + '=' + formatter(String(obj))];\n    }\n\n    var values = [];\n\n    if (typeof obj === 'undefined') {\n        return values;\n    }\n\n    var objKeys;\n    if (generateArrayPrefix === 'comma' && isArray(obj)) {\n        // we need to join elements in\n        objKeys = [{ value: obj.length > 0 ? obj.join(',') || null : void undefined }];\n    } else if (isArray(filter)) {\n        objKeys = filter;\n    } else {\n        var keys = Object.keys(obj);\n        objKeys = sort ? keys.sort(sort) : keys;\n    }\n\n    for (var j = 0; j < objKeys.length; ++j) {\n        var key = objKeys[j];\n        var value = typeof key === 'object' && typeof key.value !== 'undefined' ? key.value : obj[key];\n\n        if (skipNulls && value === null) {\n            continue;\n        }\n\n        var keyPrefix = isArray(obj)\n            ? typeof generateArrayPrefix === 'function' ? generateArrayPrefix(prefix, key) : prefix\n            : prefix + (allowDots ? '.' + key : '[' + key + ']');\n\n        pushToArray(values, stringify(\n            value,\n            keyPrefix,\n            generateArrayPrefix,\n            strictNullHandling,\n            skipNulls,\n            encoder,\n            filter,\n            sort,\n            allowDots,\n            serializeDate,\n            format,\n            formatter,\n            encodeValuesOnly,\n            charset\n        ));\n    }\n\n    return values;\n};\n\nvar normalizeStringifyOptions = function normalizeStringifyOptions(opts) {\n    if (!opts) {\n        return defaults;\n    }\n\n    if (opts.encoder !== null && typeof opts.encoder !== 'undefined' && typeof opts.encoder !== 'function') {\n        throw new TypeError('Encoder has to be a function.');\n    }\n\n    var charset = opts.charset || defaults.charset;\n    if (typeof opts.charset !== 'undefined' && opts.charset !== 'utf-8' && opts.charset !== 'iso-8859-1') {\n        throw new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined');\n    }\n\n    var format = formats['default'];\n    if (typeof opts.format !== 'undefined') {\n        if (!has.call(formats.formatters, opts.format)) {\n            throw new TypeError('Unknown format option provided.');\n        }\n        format = opts.format;\n    }\n    var formatter = formats.formatters[format];\n\n    var filter = defaults.filter;\n    if (typeof opts.filter === 'function' || isArray(opts.filter)) {\n        filter = opts.filter;\n    }\n\n    return {\n        addQueryPrefix: typeof opts.addQueryPrefix === 'boolean' ? opts.addQueryPrefix : defaults.addQueryPrefix,\n        allowDots: typeof opts.allowDots === 'undefined' ? defaults.allowDots : !!opts.allowDots,\n        charset: charset,\n        charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults.charsetSentinel,\n        delimiter: typeof opts.delimiter === 'undefined' ? defaults.delimiter : opts.delimiter,\n        encode: typeof opts.encode === 'boolean' ? opts.encode : defaults.encode,\n        encoder: typeof opts.encoder === 'function' ? opts.encoder : defaults.encoder,\n        encodeValuesOnly: typeof opts.encodeValuesOnly === 'boolean' ? opts.encodeValuesOnly : defaults.encodeValuesOnly,\n        filter: filter,\n        format: format,\n        formatter: formatter,\n        serializeDate: typeof opts.serializeDate === 'function' ? opts.serializeDate : defaults.serializeDate,\n        skipNulls: typeof opts.skipNulls === 'boolean' ? opts.skipNulls : defaults.skipNulls,\n        sort: typeof opts.sort === 'function' ? opts.sort : null,\n        strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults.strictNullHandling\n    };\n};\n\nmodule.exports = function (object, opts) {\n    var obj = object;\n    var options = normalizeStringifyOptions(opts);\n\n    var objKeys;\n    var filter;\n\n    if (typeof options.filter === 'function') {\n        filter = options.filter;\n        obj = filter('', obj);\n    } else if (isArray(options.filter)) {\n        filter = options.filter;\n        objKeys = filter;\n    }\n\n    var keys = [];\n\n    if (typeof obj !== 'object' || obj === null) {\n        return '';\n    }\n\n    var arrayFormat;\n    if (opts && opts.arrayFormat in arrayPrefixGenerators) {\n        arrayFormat = opts.arrayFormat;\n    } else if (opts && 'indices' in opts) {\n        arrayFormat = opts.indices ? 'indices' : 'repeat';\n    } else {\n        arrayFormat = 'indices';\n    }\n\n    var generateArrayPrefix = arrayPrefixGenerators[arrayFormat];\n\n    if (!objKeys) {\n        objKeys = Object.keys(obj);\n    }\n\n    if (options.sort) {\n        objKeys.sort(options.sort);\n    }\n\n    for (var i = 0; i < objKeys.length; ++i) {\n        var key = objKeys[i];\n\n        if (options.skipNulls && obj[key] === null) {\n            continue;\n        }\n        pushToArray(keys, stringify(\n            obj[key],\n            key,\n            generateArrayPrefix,\n            options.strictNullHandling,\n            options.skipNulls,\n            options.encode ? options.encoder : null,\n            options.filter,\n            options.sort,\n            options.allowDots,\n            options.serializeDate,\n            options.format,\n            options.formatter,\n            options.encodeValuesOnly,\n            options.charset\n        ));\n    }\n\n    var joined = keys.join(options.delimiter);\n    var prefix = options.addQueryPrefix === true ? '?' : '';\n\n    if (options.charsetSentinel) {\n        if (options.charset === 'iso-8859-1') {\n            // encodeURIComponent('&#10003;'), the \"numeric entity\" representation of a checkmark\n            prefix += 'utf8=%26%2310003%3B&';\n        } else {\n            // encodeURIComponent('✓')\n            prefix += 'utf8=%E2%9C%93&';\n        }\n    }\n\n    return joined.length > 0 ? prefix + joined : '';\n};\n","'use strict';\n\nvar formats = require('./formats');\n\nvar has = Object.prototype.hasOwnProperty;\nvar isArray = Array.isArray;\n\nvar hexTable = (function () {\n    var array = [];\n    for (var i = 0; i < 256; ++i) {\n        array.push('%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase());\n    }\n\n    return array;\n}());\n\nvar compactQueue = function compactQueue(queue) {\n    while (queue.length > 1) {\n        var item = queue.pop();\n        var obj = item.obj[item.prop];\n\n        if (isArray(obj)) {\n            var compacted = [];\n\n            for (var j = 0; j < obj.length; ++j) {\n                if (typeof obj[j] !== 'undefined') {\n                    compacted.push(obj[j]);\n                }\n            }\n\n            item.obj[item.prop] = compacted;\n        }\n    }\n};\n\nvar arrayToObject = function arrayToObject(source, options) {\n    var obj = options && options.plainObjects ? Object.create(null) : {};\n    for (var i = 0; i < source.length; ++i) {\n        if (typeof source[i] !== 'undefined') {\n            obj[i] = source[i];\n        }\n    }\n\n    return obj;\n};\n\nvar merge = function merge(target, source, options) {\n    /* eslint no-param-reassign: 0 */\n    if (!source) {\n        return target;\n    }\n\n    if (typeof source !== 'object') {\n        if (isArray(target)) {\n            target.push(source);\n        } else if (target && typeof target === 'object') {\n            if ((options && (options.plainObjects || options.allowPrototypes)) || !has.call(Object.prototype, source)) {\n                target[source] = true;\n            }\n        } else {\n            return [target, source];\n        }\n\n        return target;\n    }\n\n    if (!target || typeof target !== 'object') {\n        return [target].concat(source);\n    }\n\n    var mergeTarget = target;\n    if (isArray(target) && !isArray(source)) {\n        mergeTarget = arrayToObject(target, options);\n    }\n\n    if (isArray(target) && isArray(source)) {\n        source.forEach(function (item, i) {\n            if (has.call(target, i)) {\n                var targetItem = target[i];\n                if (targetItem && typeof targetItem === 'object' && item && typeof item === 'object') {\n                    target[i] = merge(targetItem, item, options);\n                } else {\n                    target.push(item);\n                }\n            } else {\n                target[i] = item;\n            }\n        });\n        return target;\n    }\n\n    return Object.keys(source).reduce(function (acc, key) {\n        var value = source[key];\n\n        if (has.call(acc, key)) {\n            acc[key] = merge(acc[key], value, options);\n        } else {\n            acc[key] = value;\n        }\n        return acc;\n    }, mergeTarget);\n};\n\nvar assign = function assignSingleSource(target, source) {\n    return Object.keys(source).reduce(function (acc, key) {\n        acc[key] = source[key];\n        return acc;\n    }, target);\n};\n\nvar decode = function (str, decoder, charset) {\n    var strWithoutPlus = str.replace(/\\+/g, ' ');\n    if (charset === 'iso-8859-1') {\n        // unescape never throws, no try...catch needed:\n        return strWithoutPlus.replace(/%[0-9a-f]{2}/gi, unescape);\n    }\n    // utf-8\n    try {\n        return decodeURIComponent(strWithoutPlus);\n    } catch (e) {\n        return strWithoutPlus;\n    }\n};\n\nvar encode = function encode(str, defaultEncoder, charset, kind, format) {\n    // This code was originally written by Brian White (mscdex) for the io.js core querystring library.\n    // It has been adapted here for stricter adherence to RFC 3986\n    if (str.length === 0) {\n        return str;\n    }\n\n    var string = str;\n    if (typeof str === 'symbol') {\n        string = Symbol.prototype.toString.call(str);\n    } else if (typeof str !== 'string') {\n        string = String(str);\n    }\n\n    if (charset === 'iso-8859-1') {\n        return escape(string).replace(/%u[0-9a-f]{4}/gi, function ($0) {\n            return '%26%23' + parseInt($0.slice(2), 16) + '%3B';\n        });\n    }\n\n    var out = '';\n    for (var i = 0; i < string.length; ++i) {\n        var c = string.charCodeAt(i);\n\n        if (\n            c === 0x2D // -\n            || c === 0x2E // .\n            || c === 0x5F // _\n            || c === 0x7E // ~\n            || (c >= 0x30 && c <= 0x39) // 0-9\n            || (c >= 0x41 && c <= 0x5A) // a-z\n            || (c >= 0x61 && c <= 0x7A) // A-Z\n            || (format === formats.RFC1738 && (c === 0x28 || c === 0x29)) // ( )\n        ) {\n            out += string.charAt(i);\n            continue;\n        }\n\n        if (c < 0x80) {\n            out = out + hexTable[c];\n            continue;\n        }\n\n        if (c < 0x800) {\n            out = out + (hexTable[0xC0 | (c >> 6)] + hexTable[0x80 | (c & 0x3F)]);\n            continue;\n        }\n\n        if (c < 0xD800 || c >= 0xE000) {\n            out = out + (hexTable[0xE0 | (c >> 12)] + hexTable[0x80 | ((c >> 6) & 0x3F)] + hexTable[0x80 | (c & 0x3F)]);\n            continue;\n        }\n\n        i += 1;\n        c = 0x10000 + (((c & 0x3FF) << 10) | (string.charCodeAt(i) & 0x3FF));\n        /* eslint operator-linebreak: [2, \"before\"] */\n        out += hexTable[0xF0 | (c >> 18)]\n            + hexTable[0x80 | ((c >> 12) & 0x3F)]\n            + hexTable[0x80 | ((c >> 6) & 0x3F)]\n            + hexTable[0x80 | (c & 0x3F)];\n    }\n\n    return out;\n};\n\nvar compact = function compact(value) {\n    var queue = [{ obj: { o: value }, prop: 'o' }];\n    var refs = [];\n\n    for (var i = 0; i < queue.length; ++i) {\n        var item = queue[i];\n        var obj = item.obj[item.prop];\n\n        var keys = Object.keys(obj);\n        for (var j = 0; j < keys.length; ++j) {\n            var key = keys[j];\n            var val = obj[key];\n            if (typeof val === 'object' && val !== null && refs.indexOf(val) === -1) {\n                queue.push({ obj: obj, prop: key });\n                refs.push(val);\n            }\n        }\n    }\n\n    compactQueue(queue);\n\n    return value;\n};\n\nvar isRegExp = function isRegExp(obj) {\n    return Object.prototype.toString.call(obj) === '[object RegExp]';\n};\n\nvar isBuffer = function isBuffer(obj) {\n    if (!obj || typeof obj !== 'object') {\n        return false;\n    }\n\n    return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj));\n};\n\nvar combine = function combine(a, b) {\n    return [].concat(a, b);\n};\n\nvar maybeMap = function maybeMap(val, fn) {\n    if (isArray(val)) {\n        var mapped = [];\n        for (var i = 0; i < val.length; i += 1) {\n            mapped.push(fn(val[i]));\n        }\n        return mapped;\n    }\n    return fn(val);\n};\n\nmodule.exports = {\n    arrayToObject: arrayToObject,\n    assign: assign,\n    combine: combine,\n    compact: compact,\n    decode: decode,\n    encode: encode,\n    isBuffer: isBuffer,\n    isRegExp: isRegExp,\n    maybeMap: maybeMap,\n    merge: merge\n};\n","'use strict';\n\nvar AlgoliaSearchHelper = require('./src/algoliasearch.helper');\nvar SearchParameters = require('./src/SearchParameters');\nvar SearchResults = require('./src/SearchResults');\n\n/**\n * The algoliasearchHelper module is the function that will let its\n * contains everything needed to use the Algoliasearch\n * Helper. It is a also a function that instanciate the helper.\n * To use the helper, you also need the Algolia JS client v3.\n * @example\n * //using the UMD build\n * var client = algoliasearch('latency', '6be0576ff61c053d5f9a3225e2a90f76');\n * var helper = algoliasearchHelper(client, 'bestbuy', {\n *   facets: ['shipping'],\n *   disjunctiveFacets: ['category']\n * });\n * helper.on('result', function(event) {\n *   console.log(event.results);\n * });\n * helper\n *   .toggleFacetRefinement('category', 'Movies & TV Shows')\n *   .toggleFacetRefinement('shipping', 'Free shipping')\n *   .search();\n * @example\n * // The helper is an event emitter using the node API\n * helper.on('result', updateTheResults);\n * helper.once('result', updateTheResults);\n * helper.removeListener('result', updateTheResults);\n * helper.removeAllListeners('result');\n * @module algoliasearchHelper\n * @param  {AlgoliaSearch} client an AlgoliaSearch client\n * @param  {string} index the name of the index to query\n * @param  {SearchParameters|object} opts an object defining the initial config of the search. It doesn't have to be a {SearchParameters}, just an object containing the properties you need from it.\n * @return {AlgoliaSearchHelper} The helper instance\n */\nfunction algoliasearchHelper(client, index, opts) {\n  return new AlgoliaSearchHelper(client, index, opts);\n}\n\n/**\n * The version currently used\n * @member module:algoliasearchHelper.version\n * @type {number}\n */\nalgoliasearchHelper.version = require('./src/version');\n\n/**\n * Constructor for the Helper.\n * @member module:algoliasearchHelper.AlgoliaSearchHelper\n * @type {AlgoliaSearchHelper}\n */\nalgoliasearchHelper.AlgoliaSearchHelper = AlgoliaSearchHelper;\n\n/**\n * Constructor for the object containing all the parameters of the search.\n * @member module:algoliasearchHelper.SearchParameters\n * @type {SearchParameters}\n */\nalgoliasearchHelper.SearchParameters = SearchParameters;\n\n/**\n * Constructor for the object containing the results of the search.\n * @member module:algoliasearchHelper.SearchResults\n * @type {SearchResults}\n */\nalgoliasearchHelper.SearchResults = SearchResults;\n\nmodule.exports = algoliasearchHelper;\n","'use strict';\n\nvar EventEmitter = require('@algolia/events');\n\nvar inherits = require('../functions/inherits');\n\n/**\n * A DerivedHelper is a way to create sub requests to\n * Algolia from a main helper.\n * @class\n * @classdesc The DerivedHelper provides an event based interface for search callbacks:\n *  - search: when a search is triggered using the `search()` method.\n *  - result: when the response is retrieved from Algolia and is processed.\n *    This event contains a {@link SearchResults} object and the\n *    {@link SearchParameters} corresponding to this answer.\n * @param {AlgoliaSearchHelper} mainHelper the main helper\n * @param {function} fn the function to create the derived state\n */\nfunction DerivedHelper(mainHelper, fn) {\n  this.main = mainHelper;\n  this.fn = fn;\n  this.lastResults = null;\n}\n\ninherits(DerivedHelper, EventEmitter);\n\n/**\n * Detach this helper from the main helper\n * @return {undefined}\n * @throws Error if the derived helper is already detached\n */\nDerivedHelper.prototype.detach = function () {\n  this.removeAllListeners();\n  this.main.detachDerivedHelper(this);\n};\n\nDerivedHelper.prototype.getModifiedState = function (parameters) {\n  return this.fn(parameters);\n};\n\nmodule.exports = DerivedHelper;\n","'use strict';\n\n/**\n * Functions to manipulate refinement lists\n *\n * The RefinementList is not formally defined through a prototype but is based\n * on a specific structure.\n *\n * @module SearchParameters.refinementList\n *\n * @typedef {string[]} SearchParameters.refinementList.Refinements\n * @typedef {Object.<string, SearchParameters.refinementList.Refinements>} SearchParameters.refinementList.RefinementList\n */\n\nvar defaultsPure = require('../functions/defaultsPure');\nvar objectHasKeys = require('../functions/objectHasKeys');\nvar omit = require('../functions/omit');\n\nvar lib = {\n  /**\n   * Adds a refinement to a RefinementList\n   * @param {RefinementList} refinementList the initial list\n   * @param {string} attribute the attribute to refine\n   * @param {string} value the value of the refinement, if the value is not a string it will be converted\n   * @return {RefinementList} a new and updated refinement list\n   */\n  addRefinement: function addRefinement(refinementList, attribute, value) {\n    if (lib.isRefined(refinementList, attribute, value)) {\n      return refinementList;\n    }\n\n    var valueAsString = '' + value;\n\n    var facetRefinement = !refinementList[attribute]\n      ? [valueAsString]\n      : refinementList[attribute].concat(valueAsString);\n\n    var mod = {};\n\n    mod[attribute] = facetRefinement;\n\n    return defaultsPure({}, mod, refinementList);\n  },\n  /**\n   * Removes refinement(s) for an attribute:\n   *  - if the value is specified removes the refinement for the value on the attribute\n   *  - if no value is specified removes all the refinements for this attribute\n   * @param {RefinementList} refinementList the initial list\n   * @param {string} attribute the attribute to refine\n   * @param {string} [value] the value of the refinement\n   * @return {RefinementList} a new and updated refinement lst\n   */\n  removeRefinement: function removeRefinement(\n    refinementList,\n    attribute,\n    value\n  ) {\n    if (value === undefined) {\n      // we use the \"filter\" form of clearRefinement, since it leaves empty values as-is\n      // the form with a string will remove the attribute completely\n      return lib.clearRefinement(refinementList, function (v, f) {\n        return attribute === f;\n      });\n    }\n\n    var valueAsString = '' + value;\n\n    return lib.clearRefinement(refinementList, function (v, f) {\n      return attribute === f && valueAsString === v;\n    });\n  },\n  /**\n   * Toggles the refinement value for an attribute.\n   * @param {RefinementList} refinementList the initial list\n   * @param {string} attribute the attribute to refine\n   * @param {string} value the value of the refinement\n   * @return {RefinementList} a new and updated list\n   */\n  toggleRefinement: function toggleRefinement(\n    refinementList,\n    attribute,\n    value\n  ) {\n    if (value === undefined)\n      throw new Error('toggleRefinement should be used with a value');\n\n    if (lib.isRefined(refinementList, attribute, value)) {\n      return lib.removeRefinement(refinementList, attribute, value);\n    }\n\n    return lib.addRefinement(refinementList, attribute, value);\n  },\n  /**\n   * Clear all or parts of a RefinementList. Depending on the arguments, three\n   * kinds of behavior can happen:\n   *  - if no attribute is provided: clears the whole list\n   *  - if an attribute is provided as a string: clears the list for the specific attribute\n   *  - if an attribute is provided as a function: discards the elements for which the function returns true\n   * @param {RefinementList} refinementList the initial list\n   * @param {string} [attribute] the attribute or function to discard\n   * @param {string} [refinementType] optional parameter to give more context to the attribute function\n   * @return {RefinementList} a new and updated refinement list\n   */\n  clearRefinement: function clearRefinement(\n    refinementList,\n    attribute,\n    refinementType\n  ) {\n    if (attribute === undefined) {\n      // return the same object if the list is already empty\n      // this is mainly for tests, as it doesn't have much impact on performance\n      if (!objectHasKeys(refinementList)) {\n        return refinementList;\n      }\n      return {};\n    } else if (typeof attribute === 'string') {\n      return omit(refinementList, [attribute]);\n    } else if (typeof attribute === 'function') {\n      var hasChanged = false;\n\n      var newRefinementList = Object.keys(refinementList).reduce(function (\n        memo,\n        key\n      ) {\n        var values = refinementList[key] || [];\n        var facetList = values.filter(function (value) {\n          return !attribute(value, key, refinementType);\n        });\n\n        if (facetList.length !== values.length) {\n          hasChanged = true;\n        }\n\n        memo[key] = facetList;\n\n        return memo;\n      },\n      {});\n\n      if (hasChanged) return newRefinementList;\n      return refinementList;\n    }\n\n    // We return nothing if the attribute is not undefined, a string or a function,\n    // as it is not a valid value for a refinement\n    return undefined;\n  },\n  /**\n   * Test if the refinement value is used for the attribute. If no refinement value\n   * is provided, test if the refinementList contains any refinement for the\n   * given attribute.\n   * @param {RefinementList} refinementList the list of refinement\n   * @param {string} attribute name of the attribute\n   * @param {string} [refinementValue] value of the filter/refinement\n   * @return {boolean} true if the attribute is refined, false otherwise\n   */\n  isRefined: function isRefined(refinementList, attribute, refinementValue) {\n    var containsRefinements =\n      Boolean(refinementList[attribute]) &&\n      refinementList[attribute].length > 0;\n\n    if (refinementValue === undefined || !containsRefinements) {\n      return containsRefinements;\n    }\n\n    var refinementValueAsString = '' + refinementValue;\n\n    return refinementList[attribute].indexOf(refinementValueAsString) !== -1;\n  },\n};\n\nmodule.exports = lib;\n","'use strict';\n\nvar defaultsPure = require('../functions/defaultsPure');\nvar find = require('../functions/find');\nvar intersection = require('../functions/intersection');\nvar merge = require('../functions/merge');\nvar objectHasKeys = require('../functions/objectHasKeys');\nvar omit = require('../functions/omit');\nvar valToNumber = require('../functions/valToNumber');\nvar isValidUserToken = require('../utils/isValidUserToken');\n\nvar RefinementList = require('./RefinementList');\n\n/**\n * isEqual, but only for numeric refinement values, possible values:\n * - 5\n * - [5]\n * - [[5]]\n * - [[5,5],[4]]\n * @param {any} a numeric refinement value\n * @param {any} b numeric refinement value\n * @return {boolean} true if the values are equal\n */\nfunction isEqualNumericRefinement(a, b) {\n  if (Array.isArray(a) && Array.isArray(b)) {\n    return (\n      a.length === b.length &&\n      a.every(function (el, i) {\n        return isEqualNumericRefinement(b[i], el);\n      })\n    );\n  }\n  return a === b;\n}\n\n/**\n * like _.find but using deep equality to be able to use it\n * to find arrays.\n * @private\n * @param {any[]} array array to search into (elements are base or array of base)\n * @param {any} searchedValue the value we're looking for (base or array of base)\n * @return {any} the searched value or undefined\n */\nfunction findArray(array, searchedValue) {\n  return find(array, function (currentValue) {\n    return isEqualNumericRefinement(currentValue, searchedValue);\n  });\n}\n\n/**\n * The facet list is the structure used to store the list of values used to\n * filter a single attribute.\n * @typedef {string[]} SearchParameters.FacetList\n */\n\n/**\n * Structure to store numeric filters with the operator as the key. The supported operators\n * are `=`, `>`, `<`, `>=`, `<=` and `!=`.\n * @typedef {Object.<string, Array.<number|number[]>>} SearchParameters.OperatorList\n */\n\n/**\n * SearchParameters is the data structure that contains all the information\n * usable for making a search to Algolia API. It doesn't do the search itself,\n * nor does it contains logic about the parameters.\n * It is an immutable object, therefore it has been created in a way that each\n * changes does not change the object itself but returns a copy with the\n * modification.\n * This object should probably not be instantiated outside of the helper. It will\n * be provided when needed. This object is documented for reference as you'll\n * get it from events generated by the {@link AlgoliaSearchHelper}.\n * If need be, instantiate the Helper from the factory function {@link SearchParameters.make}\n * @constructor\n * @classdesc contains all the parameters of a search\n * @param {object|SearchParameters} newParameters existing parameters or partial object\n * for the properties of a new SearchParameters\n * @see SearchParameters.make\n * @example <caption>SearchParameters of the first query in\n *   <a href=\"http://demos.algolia.com/instant-search-demo/\">the instant search demo</a></caption>\n{\n   \"query\": \"\",\n   \"disjunctiveFacets\": [\n      \"customerReviewCount\",\n      \"category\",\n      \"salePrice_range\",\n      \"manufacturer\"\n  ],\n   \"maxValuesPerFacet\": 30,\n   \"page\": 0,\n   \"hitsPerPage\": 10,\n   \"facets\": [\n      \"type\",\n      \"shipping\"\n  ]\n}\n */\nfunction SearchParameters(newParameters) {\n  var params = newParameters\n    ? SearchParameters._parseNumbers(newParameters)\n    : {};\n\n  if (params.userToken !== undefined && !isValidUserToken(params.userToken)) {\n    // eslint-disable-next-line no-console\n    console.warn(\n      '[algoliasearch-helper] The `userToken` parameter is invalid. This can lead to wrong analytics.\\n  - Format: [a-zA-Z0-9_-]{1,64}'\n    );\n  }\n  /**\n   * This attribute contains the list of all the conjunctive facets\n   * used. This list will be added to requested facets in the\n   * [facets attribute](https://www.algolia.com/doc/rest-api/search#param-facets) sent to algolia.\n   * @member {string[]}\n   */\n  this.facets = params.facets || [];\n  /**\n   * This attribute contains the list of all the disjunctive facets\n   * used. This list will be added to requested facets in the\n   * [facets attribute](https://www.algolia.com/doc/rest-api/search#param-facets) sent to algolia.\n   * @member {string[]}\n   */\n  this.disjunctiveFacets = params.disjunctiveFacets || [];\n  /**\n   * This attribute contains the list of all the hierarchical facets\n   * used. This list will be added to requested facets in the\n   * [facets attribute](https://www.algolia.com/doc/rest-api/search#param-facets) sent to algolia.\n   * Hierarchical facets are a sub type of disjunctive facets that\n   * let you filter faceted attributes hierarchically.\n   * @member {string[]|object[]}\n   */\n  this.hierarchicalFacets = params.hierarchicalFacets || [];\n\n  // Refinements\n  /**\n   * This attribute contains all the filters that need to be\n   * applied on the conjunctive facets. Each facet must be properly\n   * defined in the `facets` attribute.\n   *\n   * The key is the name of the facet, and the `FacetList` contains all\n   * filters selected for the associated facet name.\n   *\n   * When querying algolia, the values stored in this attribute will\n   * be translated into the `facetFilters` attribute.\n   * @member {Object.<string, SearchParameters.FacetList>}\n   */\n  this.facetsRefinements = params.facetsRefinements || {};\n  /**\n   * This attribute contains all the filters that need to be\n   * excluded from the conjunctive facets. Each facet must be properly\n   * defined in the `facets` attribute.\n   *\n   * The key is the name of the facet, and the `FacetList` contains all\n   * filters excluded for the associated facet name.\n   *\n   * When querying algolia, the values stored in this attribute will\n   * be translated into the `facetFilters` attribute.\n   * @member {Object.<string, SearchParameters.FacetList>}\n   */\n  this.facetsExcludes = params.facetsExcludes || {};\n  /**\n   * This attribute contains all the filters that need to be\n   * applied on the disjunctive facets. Each facet must be properly\n   * defined in the `disjunctiveFacets` attribute.\n   *\n   * The key is the name of the facet, and the `FacetList` contains all\n   * filters selected for the associated facet name.\n   *\n   * When querying algolia, the values stored in this attribute will\n   * be translated into the `facetFilters` attribute.\n   * @member {Object.<string, SearchParameters.FacetList>}\n   */\n  this.disjunctiveFacetsRefinements = params.disjunctiveFacetsRefinements || {};\n  /**\n   * This attribute contains all the filters that need to be\n   * applied on the numeric attributes.\n   *\n   * The key is the name of the attribute, and the value is the\n   * filters to apply to this attribute.\n   *\n   * When querying algolia, the values stored in this attribute will\n   * be translated into the `numericFilters` attribute.\n   * @member {Object.<string, SearchParameters.OperatorList>}\n   */\n  this.numericRefinements = params.numericRefinements || {};\n  /**\n   * This attribute contains all the tags used to refine the query.\n   *\n   * When querying algolia, the values stored in this attribute will\n   * be translated into the `tagFilters` attribute.\n   * @member {string[]}\n   */\n  this.tagRefinements = params.tagRefinements || [];\n  /**\n   * This attribute contains all the filters that need to be\n   * applied on the hierarchical facets. Each facet must be properly\n   * defined in the `hierarchicalFacets` attribute.\n   *\n   * The key is the name of the facet, and the `FacetList` contains all\n   * filters selected for the associated facet name. The FacetList values\n   * are structured as a string that contain the values for each level\n   * separated by the configured separator.\n   *\n   * When querying algolia, the values stored in this attribute will\n   * be translated into the `facetFilters` attribute.\n   * @member {Object.<string, SearchParameters.FacetList>}\n   */\n  this.hierarchicalFacetsRefinements =\n    params.hierarchicalFacetsRefinements || {};\n\n  // eslint-disable-next-line consistent-this\n  var self = this;\n  Object.keys(params).forEach(function (paramName) {\n    var isKeyKnown = SearchParameters.PARAMETERS.indexOf(paramName) !== -1;\n    var isValueDefined = params[paramName] !== undefined;\n\n    if (!isKeyKnown && isValueDefined) {\n      self[paramName] = params[paramName];\n    }\n  });\n}\n\n/**\n * List all the properties in SearchParameters and therefore all the known Algolia properties\n * This doesn't contain any beta/hidden features.\n * @private\n */\nSearchParameters.PARAMETERS = Object.keys(new SearchParameters());\n\n/**\n * @private\n * @param {object} partialState full or part of a state\n * @return {object} a new object with the number keys as number\n */\nSearchParameters._parseNumbers = function (partialState) {\n  // Do not parse numbers again in SearchParameters, they ought to be parsed already\n  if (partialState instanceof SearchParameters) return partialState;\n\n  var numbers = {};\n\n  var numberKeys = [\n    'aroundPrecision',\n    'aroundRadius',\n    'getRankingInfo',\n    'minWordSizefor2Typos',\n    'minWordSizefor1Typo',\n    'page',\n    'maxValuesPerFacet',\n    'distinct',\n    'minimumAroundRadius',\n    'hitsPerPage',\n    'minProximity',\n  ];\n\n  numberKeys.forEach(function (k) {\n    var value = partialState[k];\n    if (typeof value === 'string') {\n      var parsedValue = parseFloat(value);\n      // global isNaN is ok to use here, value is only number or NaN\n      numbers[k] = isNaN(parsedValue) ? value : parsedValue;\n    }\n  });\n\n  // there's two formats of insideBoundingBox, we need to parse\n  // the one which is an array of float geo rectangles\n  if (Array.isArray(partialState.insideBoundingBox)) {\n    numbers.insideBoundingBox = partialState.insideBoundingBox.map(function (\n      geoRect\n    ) {\n      if (Array.isArray(geoRect)) {\n        return geoRect.map(function (value) {\n          return parseFloat(value);\n        });\n      }\n      return geoRect;\n    });\n  }\n\n  if (partialState.numericRefinements) {\n    var numericRefinements = {};\n    Object.keys(partialState.numericRefinements).forEach(function (attribute) {\n      var operators = partialState.numericRefinements[attribute] || {};\n      numericRefinements[attribute] = {};\n      Object.keys(operators).forEach(function (operator) {\n        var values = operators[operator];\n        var parsedValues = values.map(function (v) {\n          if (Array.isArray(v)) {\n            return v.map(function (vPrime) {\n              if (typeof vPrime === 'string') {\n                return parseFloat(vPrime);\n              }\n              return vPrime;\n            });\n          } else if (typeof v === 'string') {\n            return parseFloat(v);\n          }\n          return v;\n        });\n        numericRefinements[attribute][operator] = parsedValues;\n      });\n    });\n    numbers.numericRefinements = numericRefinements;\n  }\n\n  return merge({}, partialState, numbers);\n};\n\n/**\n * Factory for SearchParameters\n * @param {object|SearchParameters} newParameters existing parameters or partial\n * object for the properties of a new SearchParameters\n * @return {SearchParameters} frozen instance of SearchParameters\n */\nSearchParameters.make = function makeSearchParameters(newParameters) {\n  var instance = new SearchParameters(newParameters);\n\n  var hierarchicalFacets = newParameters.hierarchicalFacets || [];\n  hierarchicalFacets.forEach(function (facet) {\n    if (facet.rootPath) {\n      var currentRefinement = instance.getHierarchicalRefinement(facet.name);\n\n      if (\n        currentRefinement.length > 0 &&\n        currentRefinement[0].indexOf(facet.rootPath) !== 0\n      ) {\n        instance = instance.clearRefinements(facet.name);\n      }\n\n      // get it again in case it has been cleared\n      currentRefinement = instance.getHierarchicalRefinement(facet.name);\n      if (currentRefinement.length === 0) {\n        instance = instance.toggleHierarchicalFacetRefinement(\n          facet.name,\n          facet.rootPath\n        );\n      }\n    }\n  });\n\n  return instance;\n};\n\n/**\n * Validates the new parameters based on the previous state\n * @param {SearchParameters} currentState the current state\n * @param {object|SearchParameters} parameters the new parameters to set\n * @return {Error|null} Error if the modification is invalid, null otherwise\n */\nSearchParameters.validate = function (currentState, parameters) {\n  var params = parameters || {};\n\n  if (\n    currentState.tagFilters &&\n    params.tagRefinements &&\n    params.tagRefinements.length > 0\n  ) {\n    return new Error(\n      '[Tags] Cannot switch from the managed tag API to the advanced API. It is probably ' +\n        'an error, if it is really what you want, you should first clear the tags with clearTags method.'\n    );\n  }\n\n  if (currentState.tagRefinements.length > 0 && params.tagFilters) {\n    return new Error(\n      '[Tags] Cannot switch from the advanced tag API to the managed API. It is probably ' +\n        'an error, if it is not, you should first clear the tags with clearTags method.'\n    );\n  }\n\n  if (\n    currentState.numericFilters &&\n    params.numericRefinements &&\n    objectHasKeys(params.numericRefinements)\n  ) {\n    return new Error(\n      \"[Numeric filters] Can't switch from the advanced to the managed API. It\" +\n        ' is probably an error, if this is really what you want, you have to first' +\n        ' clear the numeric filters.'\n    );\n  }\n\n  if (objectHasKeys(currentState.numericRefinements) && params.numericFilters) {\n    return new Error(\n      \"[Numeric filters] Can't switch from the managed API to the advanced. It\" +\n        ' is probably an error, if this is really what you want, you have to first' +\n        ' clear the numeric filters.'\n    );\n  }\n\n  return null;\n};\n\nSearchParameters.prototype = {\n  constructor: SearchParameters,\n\n  /**\n   * Remove all refinements (disjunctive + conjunctive + excludes + numeric filters)\n   * @method\n   * @param {undefined|string|SearchParameters.clearCallback} [attribute] optional string or function\n   * - If not given, means to clear all the filters.\n   * - If `string`, means to clear all refinements for the `attribute` named filter.\n   * - If `function`, means to clear all the refinements that return truthy values.\n   * @return {SearchParameters} new instance with filters cleared\n   */\n  clearRefinements: function clearRefinements(attribute) {\n    var patch = {\n      numericRefinements: this._clearNumericRefinements(attribute),\n      facetsRefinements: RefinementList.clearRefinement(\n        this.facetsRefinements,\n        attribute,\n        'conjunctiveFacet'\n      ),\n      facetsExcludes: RefinementList.clearRefinement(\n        this.facetsExcludes,\n        attribute,\n        'exclude'\n      ),\n      disjunctiveFacetsRefinements: RefinementList.clearRefinement(\n        this.disjunctiveFacetsRefinements,\n        attribute,\n        'disjunctiveFacet'\n      ),\n      hierarchicalFacetsRefinements: RefinementList.clearRefinement(\n        this.hierarchicalFacetsRefinements,\n        attribute,\n        'hierarchicalFacet'\n      ),\n    };\n    if (\n      patch.numericRefinements === this.numericRefinements &&\n      patch.facetsRefinements === this.facetsRefinements &&\n      patch.facetsExcludes === this.facetsExcludes &&\n      patch.disjunctiveFacetsRefinements ===\n        this.disjunctiveFacetsRefinements &&\n      patch.hierarchicalFacetsRefinements === this.hierarchicalFacetsRefinements\n    ) {\n      return this;\n    }\n    return this.setQueryParameters(patch);\n  },\n  /**\n   * Remove all the refined tags from the SearchParameters\n   * @method\n   * @return {SearchParameters} new instance with tags cleared\n   */\n  clearTags: function clearTags() {\n    if (this.tagFilters === undefined && this.tagRefinements.length === 0)\n      return this;\n\n    return this.setQueryParameters({\n      tagFilters: undefined,\n      tagRefinements: [],\n    });\n  },\n  /**\n   * Set the index.\n   * @method\n   * @param {string} index the index name\n   * @return {SearchParameters} new instance\n   */\n  setIndex: function setIndex(index) {\n    if (index === this.index) return this;\n\n    return this.setQueryParameters({\n      index: index,\n    });\n  },\n  /**\n   * Query setter\n   * @method\n   * @param {string} newQuery value for the new query\n   * @return {SearchParameters} new instance\n   */\n  setQuery: function setQuery(newQuery) {\n    if (newQuery === this.query) return this;\n\n    return this.setQueryParameters({\n      query: newQuery,\n    });\n  },\n  /**\n   * Page setter\n   * @method\n   * @param {number} newPage new page number\n   * @return {SearchParameters} new instance\n   */\n  setPage: function setPage(newPage) {\n    if (newPage === this.page) return this;\n\n    return this.setQueryParameters({\n      page: newPage,\n    });\n  },\n  /**\n   * Facets setter\n   * The facets are the simple facets, used for conjunctive (and) faceting.\n   * @method\n   * @param {string[]} facets all the attributes of the algolia records used for conjunctive faceting\n   * @return {SearchParameters} new instance\n   */\n  setFacets: function setFacets(facets) {\n    return this.setQueryParameters({\n      facets: facets,\n    });\n  },\n  /**\n   * Disjunctive facets setter\n   * Change the list of disjunctive (or) facets the helper chan handle.\n   * @method\n   * @param {string[]} facets all the attributes of the algolia records used for disjunctive faceting\n   * @return {SearchParameters} new instance\n   */\n  setDisjunctiveFacets: function setDisjunctiveFacets(facets) {\n    return this.setQueryParameters({\n      disjunctiveFacets: facets,\n    });\n  },\n  /**\n   * HitsPerPage setter\n   * Hits per page represents the number of hits retrieved for this query\n   * @method\n   * @param {number} n number of hits retrieved per page of results\n   * @return {SearchParameters} new instance\n   */\n  setHitsPerPage: function setHitsPerPage(n) {\n    if (this.hitsPerPage === n) return this;\n\n    return this.setQueryParameters({\n      hitsPerPage: n,\n    });\n  },\n  /**\n   * typoTolerance setter\n   * Set the value of typoTolerance\n   * @method\n   * @param {string} typoTolerance new value of typoTolerance (\"true\", \"false\", \"min\" or \"strict\")\n   * @return {SearchParameters} new instance\n   */\n  setTypoTolerance: function setTypoTolerance(typoTolerance) {\n    if (this.typoTolerance === typoTolerance) return this;\n\n    return this.setQueryParameters({\n      typoTolerance: typoTolerance,\n    });\n  },\n  /**\n   * Add a numeric filter for a given attribute\n   * When value is an array, they are combined with OR\n   * When value is a single value, it will combined with AND\n   * @method\n   * @param {string} attribute attribute to set the filter on\n   * @param {string} operator operator of the filter (possible values: =, >, >=, <, <=, !=)\n   * @param {number | number[]} value value of the filter\n   * @return {SearchParameters} new instance\n   * @example\n   * // for price = 50 or 40\n   * state.addNumericRefinement('price', '=', [50, 40]);\n   * @example\n   * // for size = 38 and 40\n   * state.addNumericRefinement('size', '=', 38);\n   * state.addNumericRefinement('size', '=', 40);\n   */\n  addNumericRefinement: function (attribute, operator, value) {\n    var val = valToNumber(value);\n\n    if (this.isNumericRefined(attribute, operator, val)) return this;\n\n    var mod = merge({}, this.numericRefinements);\n\n    mod[attribute] = merge({}, mod[attribute]);\n\n    if (mod[attribute][operator]) {\n      // Array copy\n      mod[attribute][operator] = mod[attribute][operator].slice();\n      // Add the element. Concat can't be used here because value can be an array.\n      mod[attribute][operator].push(val);\n    } else {\n      mod[attribute][operator] = [val];\n    }\n\n    return this.setQueryParameters({\n      numericRefinements: mod,\n    });\n  },\n  /**\n   * Get the list of conjunctive refinements for a single facet\n   * @param {string} facetName name of the attribute used for faceting\n   * @return {string[]} list of refinements\n   */\n  getConjunctiveRefinements: function (facetName) {\n    if (!this.isConjunctiveFacet(facetName)) {\n      return [];\n    }\n    return this.facetsRefinements[facetName] || [];\n  },\n  /**\n   * Get the list of disjunctive refinements for a single facet\n   * @param {string} facetName name of the attribute used for faceting\n   * @return {string[]} list of refinements\n   */\n  getDisjunctiveRefinements: function (facetName) {\n    if (!this.isDisjunctiveFacet(facetName)) {\n      return [];\n    }\n    return this.disjunctiveFacetsRefinements[facetName] || [];\n  },\n  /**\n   * Get the list of hierarchical refinements for a single facet\n   * @param {string} facetName name of the attribute used for faceting\n   * @return {string[]} list of refinements\n   */\n  getHierarchicalRefinement: function (facetName) {\n    // we send an array but we currently do not support multiple\n    // hierarchicalRefinements for a hierarchicalFacet\n    return this.hierarchicalFacetsRefinements[facetName] || [];\n  },\n  /**\n   * Get the list of exclude refinements for a single facet\n   * @param {string} facetName name of the attribute used for faceting\n   * @return {string[]} list of refinements\n   */\n  getExcludeRefinements: function (facetName) {\n    if (!this.isConjunctiveFacet(facetName)) {\n      return [];\n    }\n    return this.facetsExcludes[facetName] || [];\n  },\n\n  /**\n   * Remove all the numeric filter for a given (attribute, operator)\n   * @method\n   * @param {string} attribute attribute to set the filter on\n   * @param {string} [operator] operator of the filter (possible values: =, >, >=, <, <=, !=)\n   * @param {number} [number] the value to be removed\n   * @return {SearchParameters} new instance\n   */\n  removeNumericRefinement: function (attribute, operator, number) {\n    var paramValue = number;\n    if (paramValue !== undefined) {\n      if (!this.isNumericRefined(attribute, operator, paramValue)) {\n        return this;\n      }\n      return this.setQueryParameters({\n        numericRefinements: this._clearNumericRefinements(function (\n          value,\n          key\n        ) {\n          return (\n            key === attribute &&\n            value.op === operator &&\n            isEqualNumericRefinement(value.val, valToNumber(paramValue))\n          );\n        }),\n      });\n    } else if (operator !== undefined) {\n      if (!this.isNumericRefined(attribute, operator)) return this;\n      return this.setQueryParameters({\n        numericRefinements: this._clearNumericRefinements(function (\n          value,\n          key\n        ) {\n          return key === attribute && value.op === operator;\n        }),\n      });\n    }\n\n    if (!this.isNumericRefined(attribute)) return this;\n    return this.setQueryParameters({\n      numericRefinements: this._clearNumericRefinements(function (value, key) {\n        return key === attribute;\n      }),\n    });\n  },\n  /**\n   * Get the list of numeric refinements for a single facet\n   * @param {string} facetName name of the attribute used for faceting\n   * @return {SearchParameters.OperatorList} list of refinements\n   */\n  getNumericRefinements: function (facetName) {\n    return this.numericRefinements[facetName] || {};\n  },\n  /**\n   * Return the current refinement for the (attribute, operator)\n   * @param {string} attribute attribute in the record\n   * @param {string} operator operator applied on the refined values\n   * @return {Array.<number|number[]>} refined values\n   */\n  getNumericRefinement: function (attribute, operator) {\n    return (\n      this.numericRefinements[attribute] &&\n      this.numericRefinements[attribute][operator]\n    );\n  },\n  /**\n   * Clear numeric filters.\n   * @method\n   * @private\n   * @param {string|SearchParameters.clearCallback} [attribute] optional string or function\n   * - If not given, means to clear all the filters.\n   * - If `string`, means to clear all refinements for the `attribute` named filter.\n   * - If `function`, means to clear all the refinements that return truthy values.\n   * @return {Object.<string, OperatorList>} new numeric refinements\n   */\n  _clearNumericRefinements: function _clearNumericRefinements(attribute) {\n    if (attribute === undefined) {\n      if (!objectHasKeys(this.numericRefinements)) {\n        return this.numericRefinements;\n      }\n      return {};\n    } else if (typeof attribute === 'string') {\n      return omit(this.numericRefinements, [attribute]);\n    } else if (typeof attribute === 'function') {\n      var hasChanged = false;\n      var numericRefinements = this.numericRefinements;\n      var newNumericRefinements = Object.keys(numericRefinements).reduce(\n        function (memo, key) {\n          var operators = numericRefinements[key];\n          var operatorList = {};\n\n          operators = operators || {};\n          Object.keys(operators).forEach(function (operator) {\n            var values = operators[operator] || [];\n            var outValues = [];\n            values.forEach(function (value) {\n              var predicateResult = attribute(\n                { val: value, op: operator },\n                key,\n                'numeric'\n              );\n              if (!predicateResult) outValues.push(value);\n            });\n            if (outValues.length !== values.length) {\n              hasChanged = true;\n            }\n            operatorList[operator] = outValues;\n          });\n\n          memo[key] = operatorList;\n\n          return memo;\n        },\n        {}\n      );\n\n      if (hasChanged) return newNumericRefinements;\n      return this.numericRefinements;\n    }\n\n    // We return nothing if the attribute is not undefined, a string or a function,\n    // as it is not a valid value for a refinement\n    return undefined;\n  },\n  /**\n   * Add a facet to the facets attribute of the helper configuration, if it\n   * isn't already present.\n   * @method\n   * @param {string} facet facet name to add\n   * @return {SearchParameters} new instance\n   */\n  addFacet: function addFacet(facet) {\n    if (this.isConjunctiveFacet(facet)) {\n      return this;\n    }\n\n    return this.setQueryParameters({\n      facets: this.facets.concat([facet]),\n    });\n  },\n  /**\n   * Add a disjunctive facet to the disjunctiveFacets attribute of the helper\n   * configuration, if it isn't already present.\n   * @method\n   * @param {string} facet disjunctive facet name to add\n   * @return {SearchParameters} new instance\n   */\n  addDisjunctiveFacet: function addDisjunctiveFacet(facet) {\n    if (this.isDisjunctiveFacet(facet)) {\n      return this;\n    }\n\n    return this.setQueryParameters({\n      disjunctiveFacets: this.disjunctiveFacets.concat([facet]),\n    });\n  },\n  /**\n   * Add a hierarchical facet to the hierarchicalFacets attribute of the helper\n   * configuration.\n   * @method\n   * @param {object} hierarchicalFacet hierarchical facet to add\n   * @return {SearchParameters} new instance\n   * @throws will throw an error if a hierarchical facet with the same name was already declared\n   */\n  addHierarchicalFacet: function addHierarchicalFacet(hierarchicalFacet) {\n    if (this.isHierarchicalFacet(hierarchicalFacet.name)) {\n      throw new Error(\n        'Cannot declare two hierarchical facets with the same name: `' +\n          hierarchicalFacet.name +\n          '`'\n      );\n    }\n\n    return this.setQueryParameters({\n      hierarchicalFacets: this.hierarchicalFacets.concat([hierarchicalFacet]),\n    });\n  },\n  /**\n   * Add a refinement on a \"normal\" facet\n   * @method\n   * @param {string} facet attribute to apply the faceting on\n   * @param {string} value value of the attribute (will be converted to string)\n   * @return {SearchParameters} new instance\n   */\n  addFacetRefinement: function addFacetRefinement(facet, value) {\n    if (!this.isConjunctiveFacet(facet)) {\n      throw new Error(\n        facet +\n          ' is not defined in the facets attribute of the helper configuration'\n      );\n    }\n    if (RefinementList.isRefined(this.facetsRefinements, facet, value))\n      return this;\n\n    return this.setQueryParameters({\n      facetsRefinements: RefinementList.addRefinement(\n        this.facetsRefinements,\n        facet,\n        value\n      ),\n    });\n  },\n  /**\n   * Exclude a value from a \"normal\" facet\n   * @method\n   * @param {string} facet attribute to apply the exclusion on\n   * @param {string} value value of the attribute (will be converted to string)\n   * @return {SearchParameters} new instance\n   */\n  addExcludeRefinement: function addExcludeRefinement(facet, value) {\n    if (!this.isConjunctiveFacet(facet)) {\n      throw new Error(\n        facet +\n          ' is not defined in the facets attribute of the helper configuration'\n      );\n    }\n    if (RefinementList.isRefined(this.facetsExcludes, facet, value))\n      return this;\n\n    return this.setQueryParameters({\n      facetsExcludes: RefinementList.addRefinement(\n        this.facetsExcludes,\n        facet,\n        value\n      ),\n    });\n  },\n  /**\n   * Adds a refinement on a disjunctive facet.\n   * @method\n   * @param {string} facet attribute to apply the faceting on\n   * @param {string} value value of the attribute (will be converted to string)\n   * @return {SearchParameters} new instance\n   */\n  addDisjunctiveFacetRefinement: function addDisjunctiveFacetRefinement(\n    facet,\n    value\n  ) {\n    if (!this.isDisjunctiveFacet(facet)) {\n      throw new Error(\n        facet +\n          ' is not defined in the disjunctiveFacets attribute of the helper configuration'\n      );\n    }\n\n    if (\n      RefinementList.isRefined(this.disjunctiveFacetsRefinements, facet, value)\n    )\n      return this;\n\n    return this.setQueryParameters({\n      disjunctiveFacetsRefinements: RefinementList.addRefinement(\n        this.disjunctiveFacetsRefinements,\n        facet,\n        value\n      ),\n    });\n  },\n  /**\n   * addTagRefinement adds a tag to the list used to filter the results\n   * @param {string} tag tag to be added\n   * @return {SearchParameters} new instance\n   */\n  addTagRefinement: function addTagRefinement(tag) {\n    if (this.isTagRefined(tag)) return this;\n\n    var modification = {\n      tagRefinements: this.tagRefinements.concat(tag),\n    };\n\n    return this.setQueryParameters(modification);\n  },\n  /**\n   * Remove a facet from the facets attribute of the helper configuration, if it\n   * is present.\n   * @method\n   * @param {string} facet facet name to remove\n   * @return {SearchParameters} new instance\n   */\n  removeFacet: function removeFacet(facet) {\n    if (!this.isConjunctiveFacet(facet)) {\n      return this;\n    }\n\n    return this.clearRefinements(facet).setQueryParameters({\n      facets: this.facets.filter(function (f) {\n        return f !== facet;\n      }),\n    });\n  },\n  /**\n   * Remove a disjunctive facet from the disjunctiveFacets attribute of the\n   * helper configuration, if it is present.\n   * @method\n   * @param {string} facet disjunctive facet name to remove\n   * @return {SearchParameters} new instance\n   */\n  removeDisjunctiveFacet: function removeDisjunctiveFacet(facet) {\n    if (!this.isDisjunctiveFacet(facet)) {\n      return this;\n    }\n\n    return this.clearRefinements(facet).setQueryParameters({\n      disjunctiveFacets: this.disjunctiveFacets.filter(function (f) {\n        return f !== facet;\n      }),\n    });\n  },\n  /**\n   * Remove a hierarchical facet from the hierarchicalFacets attribute of the\n   * helper configuration, if it is present.\n   * @method\n   * @param {string} facet hierarchical facet name to remove\n   * @return {SearchParameters} new instance\n   */\n  removeHierarchicalFacet: function removeHierarchicalFacet(facet) {\n    if (!this.isHierarchicalFacet(facet)) {\n      return this;\n    }\n\n    return this.clearRefinements(facet).setQueryParameters({\n      hierarchicalFacets: this.hierarchicalFacets.filter(function (f) {\n        return f.name !== facet;\n      }),\n    });\n  },\n  /**\n   * Remove a refinement set on facet. If a value is provided, it will clear the\n   * refinement for the given value, otherwise it will clear all the refinement\n   * values for the faceted attribute.\n   * @method\n   * @param {string} facet name of the attribute used for faceting\n   * @param {string} [value] value used to filter\n   * @return {SearchParameters} new instance\n   */\n  removeFacetRefinement: function removeFacetRefinement(facet, value) {\n    if (!this.isConjunctiveFacet(facet)) {\n      throw new Error(\n        facet +\n          ' is not defined in the facets attribute of the helper configuration'\n      );\n    }\n    if (!RefinementList.isRefined(this.facetsRefinements, facet, value))\n      return this;\n\n    return this.setQueryParameters({\n      facetsRefinements: RefinementList.removeRefinement(\n        this.facetsRefinements,\n        facet,\n        value\n      ),\n    });\n  },\n  /**\n   * Remove a negative refinement on a facet\n   * @method\n   * @param {string} facet name of the attribute used for faceting\n   * @param {string} value value used to filter\n   * @return {SearchParameters} new instance\n   */\n  removeExcludeRefinement: function removeExcludeRefinement(facet, value) {\n    if (!this.isConjunctiveFacet(facet)) {\n      throw new Error(\n        facet +\n          ' is not defined in the facets attribute of the helper configuration'\n      );\n    }\n    if (!RefinementList.isRefined(this.facetsExcludes, facet, value))\n      return this;\n\n    return this.setQueryParameters({\n      facetsExcludes: RefinementList.removeRefinement(\n        this.facetsExcludes,\n        facet,\n        value\n      ),\n    });\n  },\n  /**\n   * Remove a refinement on a disjunctive facet\n   * @method\n   * @param {string} facet name of the attribute used for faceting\n   * @param {string} value value used to filter\n   * @return {SearchParameters} new instance\n   */\n  removeDisjunctiveFacetRefinement: function removeDisjunctiveFacetRefinement(\n    facet,\n    value\n  ) {\n    if (!this.isDisjunctiveFacet(facet)) {\n      throw new Error(\n        facet +\n          ' is not defined in the disjunctiveFacets attribute of the helper configuration'\n      );\n    }\n    if (\n      !RefinementList.isRefined(this.disjunctiveFacetsRefinements, facet, value)\n    )\n      return this;\n\n    return this.setQueryParameters({\n      disjunctiveFacetsRefinements: RefinementList.removeRefinement(\n        this.disjunctiveFacetsRefinements,\n        facet,\n        value\n      ),\n    });\n  },\n  /**\n   * Remove a tag from the list of tag refinements\n   * @method\n   * @param {string} tag the tag to remove\n   * @return {SearchParameters} new instance\n   */\n  removeTagRefinement: function removeTagRefinement(tag) {\n    if (!this.isTagRefined(tag)) return this;\n\n    var modification = {\n      tagRefinements: this.tagRefinements.filter(function (t) {\n        return t !== tag;\n      }),\n    };\n\n    return this.setQueryParameters(modification);\n  },\n  /**\n   * Generic toggle refinement method to use with facet, disjunctive facets\n   * and hierarchical facets\n   * @param  {string} facet the facet to refine\n   * @param  {string} value the associated value\n   * @return {SearchParameters} new instance\n   * @throws will throw an error if the facet is not declared in the settings of the helper\n   * @deprecated since version 2.19.0, see {@link SearchParameters#toggleFacetRefinement}\n   */\n  toggleRefinement: function toggleRefinement(facet, value) {\n    return this.toggleFacetRefinement(facet, value);\n  },\n  /**\n   * Generic toggle refinement method to use with facet, disjunctive facets\n   * and hierarchical facets\n   * @param  {string} facet the facet to refine\n   * @param  {string} value the associated value\n   * @return {SearchParameters} new instance\n   * @throws will throw an error if the facet is not declared in the settings of the helper\n   */\n  toggleFacetRefinement: function toggleFacetRefinement(facet, value) {\n    if (this.isHierarchicalFacet(facet)) {\n      return this.toggleHierarchicalFacetRefinement(facet, value);\n    } else if (this.isConjunctiveFacet(facet)) {\n      return this.toggleConjunctiveFacetRefinement(facet, value);\n    } else if (this.isDisjunctiveFacet(facet)) {\n      return this.toggleDisjunctiveFacetRefinement(facet, value);\n    }\n\n    throw new Error(\n      'Cannot refine the undeclared facet ' +\n        facet +\n        '; it should be added to the helper options facets, disjunctiveFacets or hierarchicalFacets'\n    );\n  },\n  /**\n   * Switch the refinement applied over a facet/value\n   * @method\n   * @param {string} facet name of the attribute used for faceting\n   * @param {value} value value used for filtering\n   * @return {SearchParameters} new instance\n   */\n  toggleConjunctiveFacetRefinement: function toggleConjunctiveFacetRefinement(\n    facet,\n    value\n  ) {\n    if (!this.isConjunctiveFacet(facet)) {\n      throw new Error(\n        facet +\n          ' is not defined in the facets attribute of the helper configuration'\n      );\n    }\n\n    return this.setQueryParameters({\n      facetsRefinements: RefinementList.toggleRefinement(\n        this.facetsRefinements,\n        facet,\n        value\n      ),\n    });\n  },\n  /**\n   * Switch the refinement applied over a facet/value\n   * @method\n   * @param {string} facet name of the attribute used for faceting\n   * @param {value} value value used for filtering\n   * @return {SearchParameters} new instance\n   */\n  toggleExcludeFacetRefinement: function toggleExcludeFacetRefinement(\n    facet,\n    value\n  ) {\n    if (!this.isConjunctiveFacet(facet)) {\n      throw new Error(\n        facet +\n          ' is not defined in the facets attribute of the helper configuration'\n      );\n    }\n\n    return this.setQueryParameters({\n      facetsExcludes: RefinementList.toggleRefinement(\n        this.facetsExcludes,\n        facet,\n        value\n      ),\n    });\n  },\n  /**\n   * Switch the refinement applied over a facet/value\n   * @method\n   * @param {string} facet name of the attribute used for faceting\n   * @param {value} value value used for filtering\n   * @return {SearchParameters} new instance\n   */\n  toggleDisjunctiveFacetRefinement: function toggleDisjunctiveFacetRefinement(\n    facet,\n    value\n  ) {\n    if (!this.isDisjunctiveFacet(facet)) {\n      throw new Error(\n        facet +\n          ' is not defined in the disjunctiveFacets attribute of the helper configuration'\n      );\n    }\n\n    return this.setQueryParameters({\n      disjunctiveFacetsRefinements: RefinementList.toggleRefinement(\n        this.disjunctiveFacetsRefinements,\n        facet,\n        value\n      ),\n    });\n  },\n  /**\n   * Switch the refinement applied over a facet/value\n   * @method\n   * @param {string} facet name of the attribute used for faceting\n   * @param {value} value value used for filtering\n   * @return {SearchParameters} new instance\n   */\n  toggleHierarchicalFacetRefinement: function toggleHierarchicalFacetRefinement(\n    facet,\n    value\n  ) {\n    if (!this.isHierarchicalFacet(facet)) {\n      throw new Error(\n        facet +\n          ' is not defined in the hierarchicalFacets attribute of the helper configuration'\n      );\n    }\n\n    var separator = this._getHierarchicalFacetSeparator(\n      this.getHierarchicalFacetByName(facet)\n    );\n\n    var mod = {};\n\n    var upOneOrMultipleLevel =\n      this.hierarchicalFacetsRefinements[facet] !== undefined &&\n      this.hierarchicalFacetsRefinements[facet].length > 0 &&\n      // remove current refinement:\n      // refinement was 'beer > IPA', call is toggleRefine('beer > IPA'), refinement should be `beer`\n      (this.hierarchicalFacetsRefinements[facet][0] === value ||\n        // remove a parent refinement of the current refinement:\n        //  - refinement was 'beer > IPA > Flying dog'\n        //  - call is toggleRefine('beer > IPA')\n        //  - refinement should be `beer`\n        this.hierarchicalFacetsRefinements[facet][0].indexOf(\n          value + separator\n        ) === 0);\n\n    if (upOneOrMultipleLevel) {\n      if (value.indexOf(separator) === -1) {\n        // go back to root level\n        mod[facet] = [];\n      } else {\n        mod[facet] = [value.slice(0, value.lastIndexOf(separator))];\n      }\n    } else {\n      mod[facet] = [value];\n    }\n\n    return this.setQueryParameters({\n      hierarchicalFacetsRefinements: defaultsPure(\n        {},\n        mod,\n        this.hierarchicalFacetsRefinements\n      ),\n    });\n  },\n\n  /**\n   * Adds a refinement on a hierarchical facet.\n   * @param {string} facet the facet name\n   * @param {string} path the hierarchical facet path\n   * @return {SearchParameter} the new state\n   * @throws Error if the facet is not defined or if the facet is refined\n   */\n  addHierarchicalFacetRefinement: function (facet, path) {\n    if (this.isHierarchicalFacetRefined(facet)) {\n      throw new Error(facet + ' is already refined.');\n    }\n    if (!this.isHierarchicalFacet(facet)) {\n      throw new Error(\n        facet +\n          ' is not defined in the hierarchicalFacets attribute of the helper configuration.'\n      );\n    }\n    var mod = {};\n    mod[facet] = [path];\n    return this.setQueryParameters({\n      hierarchicalFacetsRefinements: defaultsPure(\n        {},\n        mod,\n        this.hierarchicalFacetsRefinements\n      ),\n    });\n  },\n\n  /**\n   * Removes the refinement set on a hierarchical facet.\n   * @param {string} facet the facet name\n   * @return {SearchParameter} the new state\n   * @throws Error if the facet is not defined or if the facet is not refined\n   */\n  removeHierarchicalFacetRefinement: function (facet) {\n    if (!this.isHierarchicalFacetRefined(facet)) {\n      return this;\n    }\n    var mod = {};\n    mod[facet] = [];\n    return this.setQueryParameters({\n      hierarchicalFacetsRefinements: defaultsPure(\n        {},\n        mod,\n        this.hierarchicalFacetsRefinements\n      ),\n    });\n  },\n  /**\n   * Switch the tag refinement\n   * @method\n   * @param {string} tag the tag to remove or add\n   * @return {SearchParameters} new instance\n   */\n  toggleTagRefinement: function toggleTagRefinement(tag) {\n    if (this.isTagRefined(tag)) {\n      return this.removeTagRefinement(tag);\n    }\n\n    return this.addTagRefinement(tag);\n  },\n  /**\n   * Test if the facet name is from one of the disjunctive facets\n   * @method\n   * @param {string} facet facet name to test\n   * @return {boolean} true if facet is a disjunctive facet\n   */\n  isDisjunctiveFacet: function (facet) {\n    return this.disjunctiveFacets.indexOf(facet) > -1;\n  },\n  /**\n   * Test if the facet name is from one of the hierarchical facets\n   * @method\n   * @param {string} facetName facet name to test\n   * @return {boolean} true if facetName is a hierarchical facet\n   */\n  isHierarchicalFacet: function (facetName) {\n    return this.getHierarchicalFacetByName(facetName) !== undefined;\n  },\n  /**\n   * Test if the facet name is from one of the conjunctive/normal facets\n   * @method\n   * @param {string} facet facet name to test\n   * @return {boolean} true if facet is a conjunctive facet\n   */\n  isConjunctiveFacet: function (facet) {\n    return this.facets.indexOf(facet) > -1;\n  },\n  /**\n   * Returns true if the facet is refined, either for a specific value or in\n   * general.\n   * @method\n   * @param {string} facet name of the attribute for used for faceting\n   * @param {string} value, optional value. If passed will test that this value\n   * is filtering the given facet.\n   * @return {boolean} returns true if refined\n   */\n  isFacetRefined: function isFacetRefined(facet, value) {\n    if (!this.isConjunctiveFacet(facet)) {\n      return false;\n    }\n    return RefinementList.isRefined(this.facetsRefinements, facet, value);\n  },\n  /**\n   * Returns true if the facet contains exclusions or if a specific value is\n   * excluded.\n   *\n   * @method\n   * @param {string} facet name of the attribute for used for faceting\n   * @param {string} [value] optional value. If passed will test that this value\n   * is filtering the given facet.\n   * @return {boolean} returns true if refined\n   */\n  isExcludeRefined: function isExcludeRefined(facet, value) {\n    if (!this.isConjunctiveFacet(facet)) {\n      return false;\n    }\n    return RefinementList.isRefined(this.facetsExcludes, facet, value);\n  },\n  /**\n   * Returns true if the facet contains a refinement, or if a value passed is a\n   * refinement for the facet.\n   * @method\n   * @param {string} facet name of the attribute for used for faceting\n   * @param {string} value optional, will test if the value is used for refinement\n   * if there is one, otherwise will test if the facet contains any refinement\n   * @return {boolean} true if the facet is refined\n   */\n  isDisjunctiveFacetRefined: function isDisjunctiveFacetRefined(facet, value) {\n    if (!this.isDisjunctiveFacet(facet)) {\n      return false;\n    }\n    return RefinementList.isRefined(\n      this.disjunctiveFacetsRefinements,\n      facet,\n      value\n    );\n  },\n  /**\n   * Returns true if the facet contains a refinement, or if a value passed is a\n   * refinement for the facet.\n   * @method\n   * @param {string} facet name of the attribute for used for faceting\n   * @param {string} value optional, will test if the value is used for refinement\n   * if there is one, otherwise will test if the facet contains any refinement\n   * @return {boolean} true if the facet is refined\n   */\n  isHierarchicalFacetRefined: function isHierarchicalFacetRefined(\n    facet,\n    value\n  ) {\n    if (!this.isHierarchicalFacet(facet)) {\n      return false;\n    }\n\n    var refinements = this.getHierarchicalRefinement(facet);\n\n    if (!value) {\n      return refinements.length > 0;\n    }\n\n    return refinements.indexOf(value) !== -1;\n  },\n  /**\n   * Test if the triple (attribute, operator, value) is already refined.\n   * If only the attribute and the operator are provided, it tests if the\n   * contains any refinement value.\n   * @method\n   * @param {string} attribute attribute for which the refinement is applied\n   * @param {string} [operator] operator of the refinement\n   * @param {string} [value] value of the refinement\n   * @return {boolean} true if it is refined\n   */\n  isNumericRefined: function isNumericRefined(attribute, operator, value) {\n    if (value === undefined && operator === undefined) {\n      return Boolean(this.numericRefinements[attribute]);\n    }\n\n    var isOperatorDefined =\n      this.numericRefinements[attribute] &&\n      this.numericRefinements[attribute][operator] !== undefined;\n\n    if (value === undefined || !isOperatorDefined) {\n      return isOperatorDefined;\n    }\n\n    var parsedValue = valToNumber(value);\n    var isAttributeValueDefined =\n      findArray(this.numericRefinements[attribute][operator], parsedValue) !==\n      undefined;\n\n    return isOperatorDefined && isAttributeValueDefined;\n  },\n  /**\n   * Returns true if the tag refined, false otherwise\n   * @method\n   * @param {string} tag the tag to check\n   * @return {boolean} true if tag is refined\n   */\n  isTagRefined: function isTagRefined(tag) {\n    return this.tagRefinements.indexOf(tag) !== -1;\n  },\n  /**\n   * Returns the list of all disjunctive facets refined\n   * @method\n   * @param {string} facet name of the attribute used for faceting\n   * @param {value} value value used for filtering\n   * @return {string[]} returns the list of refinements\n   */\n  getRefinedDisjunctiveFacets: function getRefinedDisjunctiveFacets() {\n    // eslint-disable-next-line consistent-this\n    var self = this;\n\n    // attributes used for numeric filter can also be disjunctive\n    var disjunctiveNumericRefinedFacets = intersection(\n      Object.keys(this.numericRefinements).filter(function (facet) {\n        return Object.keys(self.numericRefinements[facet]).length > 0;\n      }),\n      this.disjunctiveFacets\n    );\n\n    return Object.keys(this.disjunctiveFacetsRefinements)\n      .filter(function (facet) {\n        return self.disjunctiveFacetsRefinements[facet].length > 0;\n      })\n      .concat(disjunctiveNumericRefinedFacets)\n      .concat(this.getRefinedHierarchicalFacets())\n      .sort();\n  },\n  /**\n   * Returns the list of all disjunctive facets refined\n   * @method\n   * @param {string} facet name of the attribute used for faceting\n   * @param {value} value value used for filtering\n   * @return {string[]} returns the list of refinements\n   */\n  getRefinedHierarchicalFacets: function getRefinedHierarchicalFacets() {\n    // eslint-disable-next-line consistent-this\n    var self = this;\n    return intersection(\n      // enforce the order between the two arrays,\n      // so that refinement name index === hierarchical facet index\n      this.hierarchicalFacets.map(function (facet) {\n        return facet.name;\n      }),\n      Object.keys(this.hierarchicalFacetsRefinements).filter(function (facet) {\n        return self.hierarchicalFacetsRefinements[facet].length > 0;\n      })\n    ).sort();\n  },\n  /**\n   * Returned the list of all disjunctive facets not refined\n   * @method\n   * @return {string[]} returns the list of facets that are not refined\n   */\n  getUnrefinedDisjunctiveFacets: function () {\n    var refinedFacets = this.getRefinedDisjunctiveFacets();\n\n    return this.disjunctiveFacets.filter(function (f) {\n      return refinedFacets.indexOf(f) === -1;\n    });\n  },\n\n  managedParameters: [\n    'index',\n\n    'facets',\n    'disjunctiveFacets',\n    'facetsRefinements',\n    'hierarchicalFacets',\n    'facetsExcludes',\n\n    'disjunctiveFacetsRefinements',\n    'numericRefinements',\n    'tagRefinements',\n    'hierarchicalFacetsRefinements',\n  ],\n\n  getQueryParams: function getQueryParams() {\n    var managedParameters = this.managedParameters;\n\n    var queryParams = {};\n\n    // eslint-disable-next-line consistent-this\n    var self = this;\n    Object.keys(this).forEach(function (paramName) {\n      var paramValue = self[paramName];\n      if (\n        managedParameters.indexOf(paramName) === -1 &&\n        paramValue !== undefined\n      ) {\n        queryParams[paramName] = paramValue;\n      }\n    });\n\n    return queryParams;\n  },\n  /**\n   * Let the user set a specific value for a given parameter. Will return the\n   * same instance if the parameter is invalid or if the value is the same as the\n   * previous one.\n   * @method\n   * @param {string} parameter the parameter name\n   * @param {any} value the value to be set, must be compliant with the definition\n   * of the attribute on the object\n   * @return {SearchParameters} the updated state\n   */\n  setQueryParameter: function setParameter(parameter, value) {\n    if (this[parameter] === value) return this;\n\n    var modification = {};\n\n    modification[parameter] = value;\n\n    return this.setQueryParameters(modification);\n  },\n  /**\n   * Let the user set any of the parameters with a plain object.\n   * @method\n   * @param {object} params all the keys and the values to be updated\n   * @return {SearchParameters} a new updated instance\n   */\n  setQueryParameters: function setQueryParameters(params) {\n    if (!params) return this;\n\n    var error = SearchParameters.validate(this, params);\n\n    if (error) {\n      throw error;\n    }\n\n    // eslint-disable-next-line consistent-this\n    var self = this;\n    var nextWithNumbers = SearchParameters._parseNumbers(params);\n    var previousPlainObject = Object.keys(this).reduce(function (acc, key) {\n      acc[key] = self[key];\n      return acc;\n    }, {});\n\n    var nextPlainObject = Object.keys(nextWithNumbers).reduce(function (\n      previous,\n      key\n    ) {\n      var isPreviousValueDefined = previous[key] !== undefined;\n      var isNextValueDefined = nextWithNumbers[key] !== undefined;\n\n      if (isPreviousValueDefined && !isNextValueDefined) {\n        return omit(previous, [key]);\n      }\n\n      if (isNextValueDefined) {\n        previous[key] = nextWithNumbers[key];\n      }\n\n      return previous;\n    },\n    previousPlainObject);\n\n    return new this.constructor(nextPlainObject);\n  },\n\n  /**\n   * Returns a new instance with the page reset. Two scenarios possible:\n   * the page is omitted -> return the given instance\n   * the page is set -> return a new instance with a page of 0\n   * @return {SearchParameters} a new updated instance\n   */\n  resetPage: function () {\n    if (this.page === undefined) {\n      return this;\n    }\n\n    return this.setPage(0);\n  },\n\n  /**\n   * Helper function to get the hierarchicalFacet separator or the default one (`>`)\n   * @param  {object} hierarchicalFacet the hierarchicalFacet object\n   * @return {string} returns the hierarchicalFacet.separator or `>` as default\n   */\n  _getHierarchicalFacetSortBy: function (hierarchicalFacet) {\n    return hierarchicalFacet.sortBy || ['isRefined:desc', 'name:asc'];\n  },\n\n  /**\n   * Helper function to get the hierarchicalFacet separator or the default one (`>`)\n   * @private\n   * @param  {object} hierarchicalFacet the hierarchicalFacet object\n   * @return {string} returns the hierarchicalFacet.separator or `>` as default\n   */\n  _getHierarchicalFacetSeparator: function (hierarchicalFacet) {\n    return hierarchicalFacet.separator || ' > ';\n  },\n\n  /**\n   * Helper function to get the hierarchicalFacet prefix path or null\n   * @private\n   * @param  {object} hierarchicalFacet the hierarchicalFacet object\n   * @return {string} returns the hierarchicalFacet.rootPath or null as default\n   */\n  _getHierarchicalRootPath: function (hierarchicalFacet) {\n    return hierarchicalFacet.rootPath || null;\n  },\n\n  /**\n   * Helper function to check if we show the parent level of the hierarchicalFacet\n   * @private\n   * @param  {object} hierarchicalFacet the hierarchicalFacet object\n   * @return {string} returns the hierarchicalFacet.showParentLevel or true as default\n   */\n  _getHierarchicalShowParentLevel: function (hierarchicalFacet) {\n    if (typeof hierarchicalFacet.showParentLevel === 'boolean') {\n      return hierarchicalFacet.showParentLevel;\n    }\n    return true;\n  },\n\n  /**\n   * Helper function to get the hierarchicalFacet by it's name\n   * @param  {string} hierarchicalFacetName the hierarchicalFacet name\n   * @return {object} a hierarchicalFacet\n   */\n  getHierarchicalFacetByName: function (hierarchicalFacetName) {\n    return find(this.hierarchicalFacets, function (f) {\n      return f.name === hierarchicalFacetName;\n    });\n  },\n\n  /**\n   * Get the current breadcrumb for a hierarchical facet, as an array\n   * @param  {string} facetName Hierarchical facet name\n   * @return {array.<string>} the path as an array of string\n   */\n  getHierarchicalFacetBreadcrumb: function (facetName) {\n    if (!this.isHierarchicalFacet(facetName)) {\n      return [];\n    }\n\n    var refinement = this.getHierarchicalRefinement(facetName)[0];\n    if (!refinement) return [];\n\n    var separator = this._getHierarchicalFacetSeparator(\n      this.getHierarchicalFacetByName(facetName)\n    );\n    var path = refinement.split(separator);\n    return path.map(function (part) {\n      return part.trim();\n    });\n  },\n\n  toString: function () {\n    return JSON.stringify(this, null, 2);\n  },\n};\n\n/**\n * Callback used for clearRefinement method\n * @callback SearchParameters.clearCallback\n * @param {OperatorList|FacetList} value the value of the filter\n * @param {string} key the current attribute name\n * @param {string} type `numeric`, `disjunctiveFacet`, `conjunctiveFacet`, `hierarchicalFacet` or `exclude`\n * depending on the type of facet\n * @return {boolean} `true` if the element should be removed. `false` otherwise.\n */\nmodule.exports = SearchParameters;\n","'use strict';\n\nmodule.exports = generateTrees;\n\nvar fv = require('../functions/escapeFacetValue');\nvar find = require('../functions/find');\nvar prepareHierarchicalFacetSortBy = require('../functions/formatSort');\nvar orderBy = require('../functions/orderBy');\nvar escapeFacetValue = fv.escapeFacetValue;\nvar unescapeFacetValue = fv.unescapeFacetValue;\n\nfunction generateTrees(state) {\n  return function generate(hierarchicalFacetResult, hierarchicalFacetIndex) {\n    var hierarchicalFacet = state.hierarchicalFacets[hierarchicalFacetIndex];\n    var hierarchicalFacetRefinement =\n      (state.hierarchicalFacetsRefinements[hierarchicalFacet.name] &&\n        state.hierarchicalFacetsRefinements[hierarchicalFacet.name][0]) ||\n      '';\n    var hierarchicalSeparator =\n      state._getHierarchicalFacetSeparator(hierarchicalFacet);\n    var hierarchicalRootPath =\n      state._getHierarchicalRootPath(hierarchicalFacet);\n    var hierarchicalShowParentLevel =\n      state._getHierarchicalShowParentLevel(hierarchicalFacet);\n    var sortBy = prepareHierarchicalFacetSortBy(\n      state._getHierarchicalFacetSortBy(hierarchicalFacet)\n    );\n\n    var rootExhaustive = hierarchicalFacetResult.every(function (facetResult) {\n      return facetResult.exhaustive;\n    });\n\n    var generateTreeFn = generateHierarchicalTree(\n      sortBy,\n      hierarchicalSeparator,\n      hierarchicalRootPath,\n      hierarchicalShowParentLevel,\n      hierarchicalFacetRefinement\n    );\n\n    var results = hierarchicalFacetResult;\n\n    if (hierarchicalRootPath) {\n      results = hierarchicalFacetResult.slice(\n        hierarchicalRootPath.split(hierarchicalSeparator).length\n      );\n    }\n\n    return results.reduce(generateTreeFn, {\n      name: state.hierarchicalFacets[hierarchicalFacetIndex].name,\n      count: null, // root level, no count\n      isRefined: true, // root level, always refined\n      path: null, // root level, no path\n      escapedValue: null,\n      exhaustive: rootExhaustive,\n      data: null,\n    });\n  };\n}\n\nfunction generateHierarchicalTree(\n  sortBy,\n  hierarchicalSeparator,\n  hierarchicalRootPath,\n  hierarchicalShowParentLevel,\n  currentRefinement\n) {\n  return function generateTree(\n    hierarchicalTree,\n    hierarchicalFacetResult,\n    currentHierarchicalLevel\n  ) {\n    var parent = hierarchicalTree;\n\n    if (currentHierarchicalLevel > 0) {\n      var level = 0;\n\n      parent = hierarchicalTree;\n\n      while (level < currentHierarchicalLevel) {\n        /**\n         * @type {object[]]} hierarchical data\n         */\n        var data = parent && Array.isArray(parent.data) ? parent.data : [];\n        parent = find(data, function (subtree) {\n          return subtree.isRefined;\n        });\n        level++;\n      }\n    }\n\n    // we found a refined parent, let's add current level data under it\n    if (parent) {\n      // filter values in case an object has multiple categories:\n      //   {\n      //     categories: {\n      //       level0: ['beers', 'bières'],\n      //       level1: ['beers > IPA', 'bières > Belges']\n      //     }\n      //   }\n      //\n      // If parent refinement is `beers`, then we do not want to have `bières > Belges`\n      // showing up\n\n      var picked = Object.keys(hierarchicalFacetResult.data)\n        .map(function (facetValue) {\n          return [facetValue, hierarchicalFacetResult.data[facetValue]];\n        })\n        .filter(function (tuple) {\n          var facetValue = tuple[0];\n          return onlyMatchingTree(\n            facetValue,\n            parent.path || hierarchicalRootPath,\n            currentRefinement,\n            hierarchicalSeparator,\n            hierarchicalRootPath,\n            hierarchicalShowParentLevel\n          );\n        });\n\n      parent.data = orderBy(\n        picked.map(function (tuple) {\n          var facetValue = tuple[0];\n          var facetCount = tuple[1];\n\n          return format(\n            facetCount,\n            facetValue,\n            hierarchicalSeparator,\n            unescapeFacetValue(currentRefinement),\n            hierarchicalFacetResult.exhaustive\n          );\n        }),\n        sortBy[0],\n        sortBy[1]\n      );\n    }\n\n    return hierarchicalTree;\n  };\n}\n\n// eslint-disable-next-line max-params\nfunction onlyMatchingTree(\n  facetValue,\n  parentPath,\n  currentRefinement,\n  hierarchicalSeparator,\n  hierarchicalRootPath,\n  hierarchicalShowParentLevel\n) {\n  // we want the facetValue is a child of hierarchicalRootPath\n  if (\n    hierarchicalRootPath &&\n    (facetValue.indexOf(hierarchicalRootPath) !== 0 ||\n      hierarchicalRootPath === facetValue)\n  ) {\n    return false;\n  }\n\n  // we always want root levels (only when there is no prefix path)\n  return (\n    (!hierarchicalRootPath &&\n      facetValue.indexOf(hierarchicalSeparator) === -1) ||\n    // if there is a rootPath, being root level mean 1 level under rootPath\n    (hierarchicalRootPath &&\n      facetValue.split(hierarchicalSeparator).length -\n        hierarchicalRootPath.split(hierarchicalSeparator).length ===\n        1) ||\n    // if current refinement is a root level and current facetValue is a root level,\n    // keep the facetValue\n    (facetValue.indexOf(hierarchicalSeparator) === -1 &&\n      currentRefinement.indexOf(hierarchicalSeparator) === -1) ||\n    // currentRefinement is a child of the facet value\n    currentRefinement.indexOf(facetValue) === 0 ||\n    // facetValue is a child of the current parent, add it\n    (facetValue.indexOf(parentPath + hierarchicalSeparator) === 0 &&\n      (hierarchicalShowParentLevel ||\n        facetValue.indexOf(currentRefinement) === 0))\n  );\n}\n\nfunction format(\n  facetCount,\n  facetValue,\n  hierarchicalSeparator,\n  currentRefinement,\n  exhaustive\n) {\n  var parts = facetValue.split(hierarchicalSeparator);\n  return {\n    name: parts[parts.length - 1].trim(),\n    path: facetValue,\n    escapedValue: escapeFacetValue(facetValue),\n    count: facetCount,\n    isRefined:\n      currentRefinement === facetValue ||\n      currentRefinement.indexOf(facetValue + hierarchicalSeparator) === 0,\n    exhaustive: exhaustive,\n    data: null,\n  };\n}\n","'use strict';\n\nvar compact = require('../functions/compact');\nvar defaultsPure = require('../functions/defaultsPure');\nvar fv = require('../functions/escapeFacetValue');\nvar find = require('../functions/find');\nvar findIndex = require('../functions/findIndex');\nvar formatSort = require('../functions/formatSort');\nvar merge = require('../functions/merge');\nvar orderBy = require('../functions/orderBy');\nvar escapeFacetValue = fv.escapeFacetValue;\nvar unescapeFacetValue = fv.unescapeFacetValue;\n\nvar generateHierarchicalTree = require('./generate-hierarchical-tree');\n\n/**\n * @typedef SearchResults.Facet\n * @type {object}\n * @property {string} name name of the attribute in the record\n * @property {object} data the faceting data: value, number of entries\n * @property {object} stats undefined unless facet_stats is retrieved from algolia\n */\n\n/**\n * @typedef SearchResults.HierarchicalFacet\n * @type {object}\n * @property {string} name name of the current value given the hierarchical level, trimmed.\n * If root node, you get the facet name\n * @property {number} count number of objects matching this hierarchical value\n * @property {string} path the current hierarchical value full path\n * @property {boolean} isRefined `true` if the current value was refined, `false` otherwise\n * @property {HierarchicalFacet[]} data sub values for the current level\n */\n\n/**\n * @typedef SearchResults.FacetValue\n * @type {object}\n * @property {string} name the facet value itself\n * @property {number} count times this facet appears in the results\n * @property {boolean} isRefined is the facet currently selected\n * @property {boolean} isExcluded is the facet currently excluded (only for conjunctive facets)\n */\n\n/**\n * @typedef Refinement\n * @type {object}\n * @property {string} type the type of filter used:\n * `numeric`, `facet`, `exclude`, `disjunctive`, `hierarchical`\n * @property {string} attributeName name of the attribute used for filtering\n * @property {string} name the value of the filter\n * @property {number} numericValue the value as a number. Only for numeric filters.\n * @property {string} operator the operator used. Only for numeric filters.\n * @property {number} count the number of computed hits for this filter. Only on facets.\n * @property {boolean} exhaustive if the count is exhaustive\n */\n\n/**\n * Turn an array of attributes in an object of attributes with their position in the array as value\n * @param {string[]} attributes the list of attributes in the record\n * @return {object} the list of attributes indexed by attribute name\n */\nfunction getIndices(attributes) {\n  var indices = {};\n\n  attributes.forEach(function (val, idx) {\n    indices[val] = idx;\n  });\n\n  return indices;\n}\n\nfunction assignFacetStats(dest, facetStats, key) {\n  if (facetStats && facetStats[key]) {\n    dest.stats = facetStats[key];\n  }\n}\n\n/**\n * @typedef {Object} HierarchicalFacet\n * @property {string} name\n * @property {string[]} attributes\n */\n\n/**\n * @param {HierarchicalFacet[]} hierarchicalFacets All hierarchical facets\n * @param {string} hierarchicalAttributeName The name of the hierarchical attribute\n * @return {HierarchicalFacet} The hierarchical facet matching the attribute name\n */\nfunction findMatchingHierarchicalFacetFromAttributeName(\n  hierarchicalFacets,\n  hierarchicalAttributeName\n) {\n  return find(\n    hierarchicalFacets,\n    function facetKeyMatchesAttribute(hierarchicalFacet) {\n      var facetNames = hierarchicalFacet.attributes || [];\n      return facetNames.indexOf(hierarchicalAttributeName) > -1;\n    }\n  );\n}\n\n// eslint-disable-next-line valid-jsdoc\n/**\n * Constructor for SearchResults\n * @class\n * @classdesc SearchResults contains the results of a query to Algolia using the\n * {@link AlgoliaSearchHelper}.\n * @param {SearchParameters} state state that led to the response\n * @param {array.<object>} results the results from algolia client\n * @example <caption>SearchResults of the first query in\n * <a href=\"http://demos.algolia.com/instant-search-demo\">the instant search demo</a></caption>\n{\n   \"hitsPerPage\": 10,\n   \"processingTimeMS\": 2,\n   \"facets\": [\n      {\n         \"name\": \"type\",\n         \"data\": {\n            \"HardGood\": 6627,\n            \"BlackTie\": 550,\n            \"Music\": 665,\n            \"Software\": 131,\n            \"Game\": 456,\n            \"Movie\": 1571\n         },\n         \"exhaustive\": false\n      },\n      {\n         \"exhaustive\": false,\n         \"data\": {\n            \"Free shipping\": 5507\n         },\n         \"name\": \"shipping\"\n      }\n  ],\n   \"hits\": [\n      {\n         \"thumbnailImage\": \"http://img.bbystatic.com/BestBuy_US/images/products/1688/1688832_54x108_s.gif\",\n         \"_highlightResult\": {\n            \"shortDescription\": {\n               \"matchLevel\": \"none\",\n               \"value\": \"Safeguard your PC, Mac, Android and iOS devices with comprehensive Internet protection\",\n               \"matchedWords\": []\n            },\n            \"category\": {\n               \"matchLevel\": \"none\",\n               \"value\": \"Computer Security Software\",\n               \"matchedWords\": []\n            },\n            \"manufacturer\": {\n               \"matchedWords\": [],\n               \"value\": \"Webroot\",\n               \"matchLevel\": \"none\"\n            },\n            \"name\": {\n               \"value\": \"Webroot SecureAnywhere Internet Security (3-Device) (1-Year Subscription) - Mac/Windows\",\n               \"matchedWords\": [],\n               \"matchLevel\": \"none\"\n            }\n         },\n         \"image\": \"http://img.bbystatic.com/BestBuy_US/images/products/1688/1688832_105x210_sc.jpg\",\n         \"shipping\": \"Free shipping\",\n         \"bestSellingRank\": 4,\n         \"shortDescription\": \"Safeguard your PC, Mac, Android and iOS devices with comprehensive Internet protection\",\n         \"url\": \"http://www.bestbuy.com/site/webroot-secureanywhere-internet-security-3-devi…d=1219060687969&skuId=1688832&cmp=RMX&ky=2d3GfEmNIzjA0vkzveHdZEBgpPCyMnLTJ\",\n         \"name\": \"Webroot SecureAnywhere Internet Security (3-Device) (1-Year Subscription) - Mac/Windows\",\n         \"category\": \"Computer Security Software\",\n         \"salePrice_range\": \"1 - 50\",\n         \"objectID\": \"1688832\",\n         \"type\": \"Software\",\n         \"customerReviewCount\": 5980,\n         \"salePrice\": 49.99,\n         \"manufacturer\": \"Webroot\"\n      },\n      ....\n  ],\n   \"nbHits\": 10000,\n   \"disjunctiveFacets\": [\n      {\n         \"exhaustive\": false,\n         \"data\": {\n            \"5\": 183,\n            \"12\": 112,\n            \"7\": 149,\n            ...\n         },\n         \"name\": \"customerReviewCount\",\n         \"stats\": {\n            \"max\": 7461,\n            \"avg\": 157.939,\n            \"min\": 1\n         }\n      },\n      {\n         \"data\": {\n            \"Printer Ink\": 142,\n            \"Wireless Speakers\": 60,\n            \"Point & Shoot Cameras\": 48,\n            ...\n         },\n         \"name\": \"category\",\n         \"exhaustive\": false\n      },\n      {\n         \"exhaustive\": false,\n         \"data\": {\n            \"> 5000\": 2,\n            \"1 - 50\": 6524,\n            \"501 - 2000\": 566,\n            \"201 - 500\": 1501,\n            \"101 - 200\": 1360,\n            \"2001 - 5000\": 47\n         },\n         \"name\": \"salePrice_range\"\n      },\n      {\n         \"data\": {\n            \"Dynex™\": 202,\n            \"Insignia™\": 230,\n            \"PNY\": 72,\n            ...\n         },\n         \"name\": \"manufacturer\",\n         \"exhaustive\": false\n      }\n  ],\n   \"query\": \"\",\n   \"nbPages\": 100,\n   \"page\": 0,\n   \"index\": \"bestbuy\"\n}\n **/\nfunction SearchResults(state, results, options) {\n  var mainSubResponse = results[0];\n\n  this._rawResults = results;\n\n  // eslint-disable-next-line consistent-this\n  var self = this;\n\n  // https://www.algolia.com/doc/api-reference/api-methods/search/#response\n  Object.keys(mainSubResponse).forEach(function (key) {\n    self[key] = mainSubResponse[key];\n  });\n\n  // Make every key of the result options reachable from the instance\n  Object.keys(options || {}).forEach(function (key) {\n    self[key] = options[key];\n  });\n\n  /**\n   * query used to generate the results\n   * @name query\n   * @member {string}\n   * @memberof SearchResults\n   * @instance\n   */\n  /**\n   * The query as parsed by the engine given all the rules.\n   * @name parsedQuery\n   * @member {string}\n   * @memberof SearchResults\n   * @instance\n   */\n  /**\n   * all the records that match the search parameters. Each record is\n   * augmented with a new attribute `_highlightResult`\n   * which is an object keyed by attribute and with the following properties:\n   * - `value` : the value of the facet highlighted (html)\n   * - `matchLevel`: `full`, `partial` or `none`, depending on how the query terms match\n   * @name hits\n   * @member {object[]}\n   * @memberof SearchResults\n   * @instance\n   */\n  /**\n   * index where the results come from\n   * @name index\n   * @member {string}\n   * @memberof SearchResults\n   * @instance\n   */\n  /**\n   * number of hits per page requested\n   * @name hitsPerPage\n   * @member {number}\n   * @memberof SearchResults\n   * @instance\n   */\n  /**\n   * total number of hits of this query on the index\n   * @name nbHits\n   * @member {number}\n   * @memberof SearchResults\n   * @instance\n   */\n  /**\n   * total number of pages with respect to the number of hits per page and the total number of hits\n   * @name nbPages\n   * @member {number}\n   * @memberof SearchResults\n   * @instance\n   */\n  /**\n   * current page\n   * @name page\n   * @member {number}\n   * @memberof SearchResults\n   * @instance\n   */\n  /**\n   * The position if the position was guessed by IP.\n   * @name aroundLatLng\n   * @member {string}\n   * @memberof SearchResults\n   * @instance\n   * @example \"48.8637,2.3615\",\n   */\n  /**\n   * The radius computed by Algolia.\n   * @name automaticRadius\n   * @member {string}\n   * @memberof SearchResults\n   * @instance\n   * @example \"126792922\",\n   */\n  /**\n   * String identifying the server used to serve this request.\n   *\n   * getRankingInfo needs to be set to `true` for this to be returned\n   *\n   * @name serverUsed\n   * @member {string}\n   * @memberof SearchResults\n   * @instance\n   * @example \"c7-use-2.algolia.net\",\n   */\n  /**\n   * Boolean that indicates if the computation of the counts did time out.\n   * @deprecated\n   * @name timeoutCounts\n   * @member {boolean}\n   * @memberof SearchResults\n   * @instance\n   */\n  /**\n   * Boolean that indicates if the computation of the hits did time out.\n   * @deprecated\n   * @name timeoutHits\n   * @member {boolean}\n   * @memberof SearchResults\n   * @instance\n   */\n  /**\n   * True if the counts of the facets is exhaustive\n   * @name exhaustiveFacetsCount\n   * @member {boolean}\n   * @memberof SearchResults\n   * @instance\n   */\n  /**\n   * True if the number of hits is exhaustive\n   * @name exhaustiveNbHits\n   * @member {boolean}\n   * @memberof SearchResults\n   * @instance\n   */\n  /**\n   * Contains the userData if they are set by a [query rule](https://www.algolia.com/doc/guides/query-rules/query-rules-overview/).\n   * @name userData\n   * @member {object[]}\n   * @memberof SearchResults\n   * @instance\n   */\n  /**\n   * queryID is the unique identifier of the query used to generate the current search results.\n   * This value is only available if the `clickAnalytics` search parameter is set to `true`.\n   * @name queryID\n   * @member {string}\n   * @memberof SearchResults\n   * @instance\n   */\n\n  /**\n   * sum of the processing time of all the queries\n   * @name processingTimeMS\n   * @member {number}\n   * @memberof SearchResults\n   * @instance\n   */\n  this.processingTimeMS = results.reduce(function (sum, result) {\n    return result.processingTimeMS === undefined\n      ? sum\n      : sum + result.processingTimeMS;\n  }, 0);\n\n  /**\n   * disjunctive facets results\n   * @member {SearchResults.Facet[]}\n   */\n  this.disjunctiveFacets = [];\n  /**\n   * disjunctive facets results\n   * @member {SearchResults.HierarchicalFacet[]}\n   */\n  this.hierarchicalFacets = state.hierarchicalFacets.map(\n    function initFutureTree() {\n      return [];\n    }\n  );\n  /**\n   * other facets results\n   * @member {SearchResults.Facet[]}\n   */\n  this.facets = [];\n\n  var disjunctiveFacets = state.getRefinedDisjunctiveFacets();\n\n  var facetsIndices = getIndices(state.facets);\n  var disjunctiveFacetsIndices = getIndices(state.disjunctiveFacets);\n  var nextDisjunctiveResult = 1;\n\n  // Since we send request only for disjunctive facets that have been refined,\n  // we get the facets information from the first, general, response.\n\n  var mainFacets = mainSubResponse.facets || {};\n\n  Object.keys(mainFacets).forEach(function (facetKey) {\n    var facetValueObject = mainFacets[facetKey];\n\n    var hierarchicalFacet = findMatchingHierarchicalFacetFromAttributeName(\n      state.hierarchicalFacets,\n      facetKey\n    );\n\n    if (hierarchicalFacet) {\n      // Place the hierarchicalFacet data at the correct index depending on\n      // the attributes order that was defined at the helper initialization\n      var facetIndex = hierarchicalFacet.attributes.indexOf(facetKey);\n      var idxAttributeName = findIndex(state.hierarchicalFacets, function (f) {\n        return f.name === hierarchicalFacet.name;\n      });\n      self.hierarchicalFacets[idxAttributeName][facetIndex] = {\n        attribute: facetKey,\n        data: facetValueObject,\n        exhaustive: mainSubResponse.exhaustiveFacetsCount,\n      };\n    } else {\n      var isFacetDisjunctive = state.disjunctiveFacets.indexOf(facetKey) !== -1;\n      var isFacetConjunctive = state.facets.indexOf(facetKey) !== -1;\n      var position;\n\n      if (isFacetDisjunctive) {\n        position = disjunctiveFacetsIndices[facetKey];\n        self.disjunctiveFacets[position] = {\n          name: facetKey,\n          data: facetValueObject,\n          exhaustive: mainSubResponse.exhaustiveFacetsCount,\n        };\n        assignFacetStats(\n          self.disjunctiveFacets[position],\n          mainSubResponse.facets_stats,\n          facetKey\n        );\n      }\n      if (isFacetConjunctive) {\n        position = facetsIndices[facetKey];\n        self.facets[position] = {\n          name: facetKey,\n          data: facetValueObject,\n          exhaustive: mainSubResponse.exhaustiveFacetsCount,\n        };\n        assignFacetStats(\n          self.facets[position],\n          mainSubResponse.facets_stats,\n          facetKey\n        );\n      }\n    }\n  });\n\n  // Make sure we do not keep holes within the hierarchical facets\n  this.hierarchicalFacets = compact(this.hierarchicalFacets);\n\n  // aggregate the refined disjunctive facets\n  disjunctiveFacets.forEach(function (disjunctiveFacet) {\n    var result = results[nextDisjunctiveResult];\n    var facets = result && result.facets ? result.facets : {};\n    var hierarchicalFacet = state.getHierarchicalFacetByName(disjunctiveFacet);\n\n    // There should be only item in facets.\n    Object.keys(facets).forEach(function (dfacet) {\n      var facetResults = facets[dfacet];\n\n      var position;\n\n      if (hierarchicalFacet) {\n        position = findIndex(state.hierarchicalFacets, function (f) {\n          return f.name === hierarchicalFacet.name;\n        });\n        var attributeIndex = findIndex(\n          self.hierarchicalFacets[position],\n          function (f) {\n            return f.attribute === dfacet;\n          }\n        );\n\n        // previous refinements and no results so not able to find it\n        if (attributeIndex === -1) {\n          return;\n        }\n\n        self.hierarchicalFacets[position][attributeIndex].data = merge(\n          {},\n          self.hierarchicalFacets[position][attributeIndex].data,\n          facetResults\n        );\n      } else {\n        position = disjunctiveFacetsIndices[dfacet];\n\n        var dataFromMainRequest =\n          (mainSubResponse.facets && mainSubResponse.facets[dfacet]) || {};\n\n        self.disjunctiveFacets[position] = {\n          name: dfacet,\n          data: defaultsPure({}, facetResults, dataFromMainRequest),\n          exhaustive: result.exhaustiveFacetsCount,\n        };\n        assignFacetStats(\n          self.disjunctiveFacets[position],\n          result.facets_stats,\n          dfacet\n        );\n\n        if (state.disjunctiveFacetsRefinements[dfacet]) {\n          state.disjunctiveFacetsRefinements[dfacet].forEach(function (\n            refinementValue\n          ) {\n            // add the disjunctive refinements if it is no more retrieved\n            if (\n              !self.disjunctiveFacets[position].data[refinementValue] &&\n              state.disjunctiveFacetsRefinements[dfacet].indexOf(\n                unescapeFacetValue(refinementValue)\n              ) > -1\n            ) {\n              self.disjunctiveFacets[position].data[refinementValue] = 0;\n            }\n          });\n        }\n      }\n    });\n    nextDisjunctiveResult++;\n  });\n\n  // if we have some parent level values for hierarchical facets, merge them\n  state.getRefinedHierarchicalFacets().forEach(function (refinedFacet) {\n    var hierarchicalFacet = state.getHierarchicalFacetByName(refinedFacet);\n    var separator = state._getHierarchicalFacetSeparator(hierarchicalFacet);\n\n    var currentRefinement = state.getHierarchicalRefinement(refinedFacet);\n    // if we are already at a root refinement (or no refinement at all), there is no\n    // root level values request\n    if (\n      currentRefinement.length === 0 ||\n      currentRefinement[0].split(separator).length < 2\n    ) {\n      return;\n    }\n\n    results.slice(nextDisjunctiveResult).forEach(function (result) {\n      var facets = result && result.facets ? result.facets : {};\n\n      Object.keys(facets).forEach(function (dfacet) {\n        var facetResults = facets[dfacet];\n        var position = findIndex(state.hierarchicalFacets, function (f) {\n          return f.name === hierarchicalFacet.name;\n        });\n        var attributeIndex = findIndex(\n          self.hierarchicalFacets[position],\n          function (f) {\n            return f.attribute === dfacet;\n          }\n        );\n\n        // previous refinements and no results so not able to find it\n        if (attributeIndex === -1) {\n          return;\n        }\n\n        // when we always get root levels, if the hits refinement is `beers > IPA` (count: 5),\n        // then the disjunctive values will be `beers` (count: 100),\n        // but we do not want to display\n        //   | beers (100)\n        //     > IPA (5)\n        // We want\n        //   | beers (5)\n        //     > IPA (5)\n        var defaultData = {};\n\n        if (currentRefinement.length > 0) {\n          var root = currentRefinement[0].split(separator)[0];\n          defaultData[root] =\n            self.hierarchicalFacets[position][attributeIndex].data[root];\n        }\n\n        self.hierarchicalFacets[position][attributeIndex].data = defaultsPure(\n          defaultData,\n          facetResults,\n          self.hierarchicalFacets[position][attributeIndex].data\n        );\n      });\n\n      nextDisjunctiveResult++;\n    });\n  });\n\n  // add the excludes\n  Object.keys(state.facetsExcludes).forEach(function (facetName) {\n    var excludes = state.facetsExcludes[facetName];\n    var position = facetsIndices[facetName];\n\n    self.facets[position] = {\n      name: facetName,\n      data: mainFacets[facetName],\n      exhaustive: mainSubResponse.exhaustiveFacetsCount,\n    };\n    excludes.forEach(function (facetValue) {\n      self.facets[position] = self.facets[position] || { name: facetName };\n      self.facets[position].data = self.facets[position].data || {};\n      self.facets[position].data[facetValue] = 0;\n    });\n  });\n\n  /**\n   * @type {Array}\n   */\n  this.hierarchicalFacets = this.hierarchicalFacets.map(\n    generateHierarchicalTree(state)\n  );\n\n  /**\n   * @type {Array}\n   */\n  this.facets = compact(this.facets);\n  /**\n   * @type {Array}\n   */\n  this.disjunctiveFacets = compact(this.disjunctiveFacets);\n\n  this._state = state;\n}\n\n/**\n * Get a facet object with its name\n * @deprecated\n * @param {string} name name of the faceted attribute\n * @return {SearchResults.Facet} the facet object\n */\nSearchResults.prototype.getFacetByName = function (name) {\n  function predicate(facet) {\n    return facet.name === name;\n  }\n\n  return (\n    find(this.facets, predicate) ||\n    find(this.disjunctiveFacets, predicate) ||\n    find(this.hierarchicalFacets, predicate)\n  );\n};\n\n/**\n * Get the facet values of a specified attribute from a SearchResults object.\n * @private\n * @param {SearchResults} results the search results to search in\n * @param {string} attribute name of the faceted attribute to search for\n * @return {array|object} facet values. For the hierarchical facets it is an object.\n */\nfunction extractNormalizedFacetValues(results, attribute) {\n  function predicate(facet) {\n    return facet.name === attribute;\n  }\n\n  if (results._state.isConjunctiveFacet(attribute)) {\n    var facet = find(results.facets, predicate);\n    if (!facet) return [];\n\n    return Object.keys(facet.data).map(function (name) {\n      var value = escapeFacetValue(name);\n      return {\n        name: name,\n        escapedValue: value,\n        count: facet.data[name],\n        isRefined: results._state.isFacetRefined(attribute, value),\n        isExcluded: results._state.isExcludeRefined(attribute, name),\n      };\n    });\n  } else if (results._state.isDisjunctiveFacet(attribute)) {\n    var disjunctiveFacet = find(results.disjunctiveFacets, predicate);\n    if (!disjunctiveFacet) return [];\n\n    return Object.keys(disjunctiveFacet.data).map(function (name) {\n      var value = escapeFacetValue(name);\n      return {\n        name: name,\n        escapedValue: value,\n        count: disjunctiveFacet.data[name],\n        isRefined: results._state.isDisjunctiveFacetRefined(attribute, value),\n      };\n    });\n  } else if (results._state.isHierarchicalFacet(attribute)) {\n    var hierarchicalFacetValues = find(results.hierarchicalFacets, predicate);\n    if (!hierarchicalFacetValues) return hierarchicalFacetValues;\n\n    var hierarchicalFacet =\n      results._state.getHierarchicalFacetByName(attribute);\n    var separator =\n      results._state._getHierarchicalFacetSeparator(hierarchicalFacet);\n    var currentRefinement = unescapeFacetValue(\n      results._state.getHierarchicalRefinement(attribute)[0] || ''\n    );\n\n    if (currentRefinement.indexOf(hierarchicalFacet.rootPath) === 0) {\n      currentRefinement = currentRefinement.replace(\n        hierarchicalFacet.rootPath + separator,\n        ''\n      );\n    }\n\n    var currentRefinementSplit = currentRefinement.split(separator);\n    currentRefinementSplit.unshift(attribute);\n\n    setIsRefined(hierarchicalFacetValues, currentRefinementSplit, 0);\n\n    return hierarchicalFacetValues;\n  }\n\n  return undefined;\n}\n\n/**\n * Set the isRefined of a hierarchical facet result based on the current state.\n * @param {SearchResults.HierarchicalFacet} item Hierarchical facet to fix\n * @param {string[]} currentRefinement array of parts of the current hierarchical refinement\n * @param {number} depth recursion depth in the currentRefinement\n * @return {undefined} function mutates the item\n */\nfunction setIsRefined(item, currentRefinement, depth) {\n  item.isRefined = item.name === currentRefinement[depth];\n  if (item.data) {\n    item.data.forEach(function (child) {\n      setIsRefined(child, currentRefinement, depth + 1);\n    });\n  }\n}\n\n/**\n * Sort nodes of a hierarchical or disjunctive facet results\n * @private\n * @param {function} sortFn sort function to apply\n * @param {HierarchicalFacet|Array} node node upon which we want to apply the sort\n * @param {string[]} names attribute names\n * @param {number} [level=0] current index in the names array\n * @return {HierarchicalFacet|Array} sorted node\n */\nfunction recSort(sortFn, node, names, level) {\n  level = level || 0;\n\n  if (Array.isArray(node)) {\n    return sortFn(node, names[level]);\n  }\n\n  if (!node.data || node.data.length === 0) {\n    return node;\n  }\n\n  var children = node.data.map(function (childNode) {\n    return recSort(sortFn, childNode, names, level + 1);\n  });\n  var sortedChildren = sortFn(children, names[level]);\n  var newNode = defaultsPure({ data: sortedChildren }, node);\n  return newNode;\n}\n\nSearchResults.DEFAULT_SORT = ['isRefined:desc', 'count:desc', 'name:asc'];\n\nfunction vanillaSortFn(order, data) {\n  return data.sort(order);\n}\n\n/**\n * @typedef FacetOrdering\n * @type {Object}\n * @property {string[]} [order]\n * @property {'count' | 'alpha' | 'hidden'} [sortRemainingBy]\n */\n\n/**\n * Sorts facet arrays via their facet ordering\n * @param {Array} facetValues the values\n * @param {FacetOrdering} facetOrdering the ordering\n * @returns {Array} the sorted facet values\n */\nfunction sortViaFacetOrdering(facetValues, facetOrdering) {\n  var orderedFacets = [];\n  var remainingFacets = [];\n\n  var order = facetOrdering.order || [];\n  /**\n   * an object with the keys being the values in order, the values their index:\n   * ['one', 'two'] -> { one: 0, two: 1 }\n   */\n  var reverseOrder = order.reduce(function (acc, name, i) {\n    acc[name] = i;\n    return acc;\n  }, {});\n\n  facetValues.forEach(function (item) {\n    // hierarchical facets get sorted using their raw name\n    var name = item.path || item.name;\n    if (reverseOrder[name] !== undefined) {\n      orderedFacets[reverseOrder[name]] = item;\n    } else {\n      remainingFacets.push(item);\n    }\n  });\n\n  orderedFacets = orderedFacets.filter(function (facet) {\n    return facet;\n  });\n\n  var sortRemainingBy = facetOrdering.sortRemainingBy;\n  var ordering;\n  if (sortRemainingBy === 'hidden') {\n    return orderedFacets;\n  } else if (sortRemainingBy === 'alpha') {\n    ordering = [\n      ['path', 'name'],\n      ['asc', 'asc'],\n    ];\n  } else {\n    ordering = [['count'], ['desc']];\n  }\n\n  return orderedFacets.concat(\n    orderBy(remainingFacets, ordering[0], ordering[1])\n  );\n}\n\n/**\n * @param {SearchResults} results the search results class\n * @param {string} attribute the attribute to retrieve ordering of\n * @returns {FacetOrdering | undefined} the facet ordering\n */\nfunction getFacetOrdering(results, attribute) {\n  return (\n    results.renderingContent &&\n    results.renderingContent.facetOrdering &&\n    results.renderingContent.facetOrdering.values &&\n    results.renderingContent.facetOrdering.values[attribute]\n  );\n}\n\n/**\n * Get a the list of values for a given facet attribute. Those values are sorted\n * refinement first, descending count (bigger value on top), and name ascending\n * (alphabetical order). The sort formula can overridden using either string based\n * predicates or a function.\n *\n * This method will return all the values returned by the Algolia engine plus all\n * the values already refined. This means that it can happen that the\n * `maxValuesPerFacet` [configuration](https://www.algolia.com/doc/rest-api/search#param-maxValuesPerFacet)\n * might not be respected if you have facet values that are already refined.\n * @param {string} attribute attribute name\n * @param {object} opts configuration options.\n * @param {boolean} [opts.facetOrdering]\n * Force the use of facetOrdering from the result if a sortBy is present. If\n * sortBy isn't present, facetOrdering will be used automatically.\n * @param {Array.<string> | function} opts.sortBy\n * When using strings, it consists of\n * the name of the [FacetValue](#SearchResults.FacetValue) or the\n * [HierarchicalFacet](#SearchResults.HierarchicalFacet) attributes with the\n * order (`asc` or `desc`). For example to order the value by count, the\n * argument would be `['count:asc']`.\n *\n * If only the attribute name is specified, the ordering defaults to the one\n * specified in the default value for this attribute.\n *\n * When not specified, the order is\n * ascending.  This parameter can also be a function which takes two facet\n * values and should return a number, 0 if equal, 1 if the first argument is\n * bigger or -1 otherwise.\n *\n * The default value for this attribute `['isRefined:desc', 'count:desc', 'name:asc']`\n * @return {FacetValue[]|HierarchicalFacet|undefined} depending on the type of facet of\n * the attribute requested (hierarchical, disjunctive or conjunctive)\n * @example\n * helper.on('result', function(event){\n *   //get values ordered only by name ascending using the string predicate\n *   event.results.getFacetValues('city', {sortBy: ['name:asc']});\n *   //get values  ordered only by count ascending using a function\n *   event.results.getFacetValues('city', {\n *     // this is equivalent to ['count:asc']\n *     sortBy: function(a, b) {\n *       if (a.count === b.count) return 0;\n *       if (a.count > b.count)   return 1;\n *       if (b.count > a.count)   return -1;\n *     }\n *   });\n * });\n */\nSearchResults.prototype.getFacetValues = function (attribute, opts) {\n  var facetValues = extractNormalizedFacetValues(this, attribute);\n  if (!facetValues) {\n    return undefined;\n  }\n\n  var options = defaultsPure({}, opts, {\n    sortBy: SearchResults.DEFAULT_SORT,\n    // if no sortBy is given, attempt to sort based on facetOrdering\n    // if it is given, we still allow to sort via facet ordering first\n    facetOrdering: !(opts && opts.sortBy),\n  });\n\n  // eslint-disable-next-line consistent-this\n  var results = this;\n  var attributes;\n  if (Array.isArray(facetValues)) {\n    attributes = [attribute];\n  } else {\n    var config = results._state.getHierarchicalFacetByName(facetValues.name);\n    attributes = config.attributes;\n  }\n\n  return recSort(\n    function (data, facetName) {\n      if (options.facetOrdering) {\n        var facetOrdering = getFacetOrdering(results, facetName);\n        if (facetOrdering) {\n          return sortViaFacetOrdering(data, facetOrdering);\n        }\n      }\n\n      if (Array.isArray(options.sortBy)) {\n        var order = formatSort(options.sortBy, SearchResults.DEFAULT_SORT);\n        return orderBy(data, order[0], order[1]);\n      } else if (typeof options.sortBy === 'function') {\n        return vanillaSortFn(options.sortBy, data);\n      }\n      throw new Error(\n        'options.sortBy is optional but if defined it must be ' +\n          'either an array of string (predicates) or a sorting function'\n      );\n    },\n    facetValues,\n    attributes\n  );\n};\n\n/**\n * Returns the facet stats if attribute is defined and the facet contains some.\n * Otherwise returns undefined.\n * @param {string} attribute name of the faceted attribute\n * @return {object} The stats of the facet\n */\nSearchResults.prototype.getFacetStats = function (attribute) {\n  if (this._state.isConjunctiveFacet(attribute)) {\n    return getFacetStatsIfAvailable(this.facets, attribute);\n  } else if (this._state.isDisjunctiveFacet(attribute)) {\n    return getFacetStatsIfAvailable(this.disjunctiveFacets, attribute);\n  }\n\n  return undefined;\n};\n\n/**\n * @typedef {Object} FacetListItem\n * @property {string} name\n */\n\n/**\n * @param {FacetListItem[]} facetList (has more items, but enough for here)\n * @param {string} facetName The attribute to look for\n * @return {object|undefined} The stats of the facet\n */\nfunction getFacetStatsIfAvailable(facetList, facetName) {\n  var data = find(facetList, function (facet) {\n    return facet.name === facetName;\n  });\n  return data && data.stats;\n}\n\n/**\n * Returns all refinements for all filters + tags. It also provides\n * additional information: count and exhaustiveness for each filter.\n *\n * See the [refinement type](#Refinement) for an exhaustive view of the available\n * data.\n *\n * Note that for a numeric refinement, results are grouped per operator, this\n * means that it will return responses for operators which are empty.\n *\n * @return {Array.<Refinement>} all the refinements\n */\nSearchResults.prototype.getRefinements = function () {\n  var state = this._state;\n  // eslint-disable-next-line consistent-this\n  var results = this;\n  var res = [];\n\n  Object.keys(state.facetsRefinements).forEach(function (attributeName) {\n    state.facetsRefinements[attributeName].forEach(function (name) {\n      res.push(\n        getRefinement(state, 'facet', attributeName, name, results.facets)\n      );\n    });\n  });\n\n  Object.keys(state.facetsExcludes).forEach(function (attributeName) {\n    state.facetsExcludes[attributeName].forEach(function (name) {\n      res.push(\n        getRefinement(state, 'exclude', attributeName, name, results.facets)\n      );\n    });\n  });\n\n  Object.keys(state.disjunctiveFacetsRefinements).forEach(function (\n    attributeName\n  ) {\n    state.disjunctiveFacetsRefinements[attributeName].forEach(function (name) {\n      res.push(\n        getRefinement(\n          state,\n          'disjunctive',\n          attributeName,\n          name,\n          results.disjunctiveFacets\n        )\n      );\n    });\n  });\n\n  Object.keys(state.hierarchicalFacetsRefinements).forEach(function (\n    attributeName\n  ) {\n    state.hierarchicalFacetsRefinements[attributeName].forEach(function (name) {\n      res.push(\n        getHierarchicalRefinement(\n          state,\n          attributeName,\n          name,\n          results.hierarchicalFacets\n        )\n      );\n    });\n  });\n\n  Object.keys(state.numericRefinements).forEach(function (attributeName) {\n    var operators = state.numericRefinements[attributeName];\n    Object.keys(operators).forEach(function (operator) {\n      operators[operator].forEach(function (value) {\n        res.push({\n          type: 'numeric',\n          attributeName: attributeName,\n          name: value,\n          numericValue: value,\n          operator: operator,\n        });\n      });\n    });\n  });\n\n  state.tagRefinements.forEach(function (name) {\n    res.push({ type: 'tag', attributeName: '_tags', name: name });\n  });\n\n  return res;\n};\n\n/**\n * @typedef {Object} Facet\n * @property {string} name\n * @property {Object} data\n * @property {boolean} exhaustive\n */\n\n/**\n * @param {SearchParameters} state the current state\n * @param {string} type the type of the refinement\n * @param {string} attributeName The attribute of the facet\n * @param {*} name The name of the facet\n * @param {Facet[]} resultsFacets facets from the results\n * @return {Refinement} the refinement\n */\nfunction getRefinement(state, type, attributeName, name, resultsFacets) {\n  var facet = find(resultsFacets, function (f) {\n    return f.name === attributeName;\n  });\n  var count = facet && facet.data && facet.data[name] ? facet.data[name] : 0;\n  var exhaustive = (facet && facet.exhaustive) || false;\n\n  return {\n    type: type,\n    attributeName: attributeName,\n    name: name,\n    count: count,\n    exhaustive: exhaustive,\n  };\n}\n\n/**\n * @param {SearchParameters} state the current state\n * @param {string} attributeName the attribute of the hierarchical facet\n * @param {string} name the name of the facet\n * @param {Facet[]} resultsFacets facets from the results\n * @return {HierarchicalFacet} the hierarchical facet\n */\nfunction getHierarchicalRefinement(state, attributeName, name, resultsFacets) {\n  var facetDeclaration = state.getHierarchicalFacetByName(attributeName);\n  var separator = state._getHierarchicalFacetSeparator(facetDeclaration);\n  var split = name.split(separator);\n  var rootFacet = find(resultsFacets, function (facet) {\n    return facet.name === attributeName;\n  });\n\n  var facet = split.reduce(function (intermediateFacet, part) {\n    var newFacet =\n      intermediateFacet &&\n      find(intermediateFacet.data, function (f) {\n        return f.name === part;\n      });\n    return newFacet !== undefined ? newFacet : intermediateFacet;\n  }, rootFacet);\n\n  var count = (facet && facet.count) || 0;\n  var exhaustive = (facet && facet.exhaustive) || false;\n  var path = (facet && facet.path) || '';\n\n  return {\n    type: 'hierarchical',\n    attributeName: attributeName,\n    name: path,\n    count: count,\n    exhaustive: exhaustive,\n  };\n}\n\nmodule.exports = SearchResults;\n","'use strict';\n\nvar EventEmitter = require('@algolia/events');\n\nvar DerivedHelper = require('./DerivedHelper');\nvar escapeFacetValue = require('./functions/escapeFacetValue').escapeFacetValue;\nvar inherits = require('./functions/inherits');\nvar merge = require('./functions/merge');\nvar objectHasKeys = require('./functions/objectHasKeys');\nvar omit = require('./functions/omit');\nvar requestBuilder = require('./requestBuilder');\nvar SearchParameters = require('./SearchParameters');\nvar SearchResults = require('./SearchResults');\nvar version = require('./version');\n\n/**\n * Event triggered when a parameter is set or updated\n * @event AlgoliaSearchHelper#event:change\n * @property {object} event\n * @property {SearchParameters} event.state the current parameters with the latest changes applied\n * @property {SearchResults} event.results the previous results received from Algolia. `null` before the first request\n * @example\n * helper.on('change', function(event) {\n *   console.log('The parameters have changed');\n * });\n */\n\n/**\n * Event triggered when a main search is sent to Algolia\n * @event AlgoliaSearchHelper#event:search\n * @property {object} event\n * @property {SearchParameters} event.state the parameters used for this search\n * @property {SearchResults} event.results the results from the previous search. `null` if it is the first search.\n * @example\n * helper.on('search', function(event) {\n *   console.log('Search sent');\n * });\n */\n\n/**\n * Event triggered when a search using `searchForFacetValues` is sent to Algolia\n * @event AlgoliaSearchHelper#event:searchForFacetValues\n * @property {object} event\n * @property {SearchParameters} event.state the parameters used for this search it is the first search.\n * @property {string} event.facet the facet searched into\n * @property {string} event.query the query used to search in the facets\n * @example\n * helper.on('searchForFacetValues', function(event) {\n *   console.log('searchForFacetValues sent');\n * });\n */\n\n/**\n * Event triggered when a search using `searchOnce` is sent to Algolia\n * @event AlgoliaSearchHelper#event:searchOnce\n * @property {object} event\n * @property {SearchParameters} event.state the parameters used for this search it is the first search.\n * @example\n * helper.on('searchOnce', function(event) {\n *   console.log('searchOnce sent');\n * });\n */\n\n/**\n * Event triggered when the results are retrieved from Algolia\n * @event AlgoliaSearchHelper#event:result\n * @property {object} event\n * @property {SearchResults} event.results the results received from Algolia\n * @property {SearchParameters} event.state the parameters used to query Algolia. Those might be different from the one in the helper instance (for example if the network is unreliable).\n * @example\n * helper.on('result', function(event) {\n *   console.log('Search results received');\n * });\n */\n\n/**\n * Event triggered when Algolia sends back an error. For example, if an unknown parameter is\n * used, the error can be caught using this event.\n * @event AlgoliaSearchHelper#event:error\n * @property {object} event\n * @property {Error} event.error the error returned by the Algolia.\n * @example\n * helper.on('error', function(event) {\n *   console.log('Houston we got a problem.');\n * });\n */\n\n/**\n * Event triggered when the queue of queries have been depleted (with any result or outdated queries)\n * @event AlgoliaSearchHelper#event:searchQueueEmpty\n * @example\n * helper.on('searchQueueEmpty', function() {\n *   console.log('No more search pending');\n *   // This is received before the result event if we're not expecting new results\n * });\n *\n * helper.search();\n */\n\n/**\n * Initialize a new AlgoliaSearchHelper\n * @class\n * @classdesc The AlgoliaSearchHelper is a class that ease the management of the\n * search. It provides an event based interface for search callbacks:\n *  - change: when the internal search state is changed.\n *    This event contains a {@link SearchParameters} object and the\n *    {@link SearchResults} of the last result if any.\n *  - search: when a search is triggered using the `search()` method.\n *  - result: when the response is retrieved from Algolia and is processed.\n *    This event contains a {@link SearchResults} object and the\n *    {@link SearchParameters} corresponding to this answer.\n *  - error: when the response is an error. This event contains the error returned by the server.\n * @param  {AlgoliaSearch} client an AlgoliaSearch client\n * @param  {string} index the index name to query\n * @param  {SearchParameters | object} options an object defining the initial\n * config of the search. It doesn't have to be a {SearchParameters},\n * just an object containing the properties you need from it.\n */\nfunction AlgoliaSearchHelper(client, index, options) {\n  if (typeof client.addAlgoliaAgent === 'function') {\n    client.addAlgoliaAgent('JS Helper (' + version + ')');\n  }\n\n  this.setClient(client);\n  var opts = options || {};\n  opts.index = index;\n  this.state = SearchParameters.make(opts);\n  this.lastResults = null;\n  this._queryId = 0;\n  this._lastQueryIdReceived = -1;\n  this.derivedHelpers = [];\n  this._currentNbQueries = 0;\n}\n\ninherits(AlgoliaSearchHelper, EventEmitter);\n\n/**\n * Start the search with the parameters set in the state. When the\n * method is called, it triggers a `search` event. The results will\n * be available through the `result` event. If an error occurs, an\n * `error` will be fired instead.\n * @return {AlgoliaSearchHelper} Method is chainable, it returns itself\n * @fires search\n * @fires result\n * @fires error\n * @chainable\n */\nAlgoliaSearchHelper.prototype.search = function () {\n  this._search({ onlyWithDerivedHelpers: false });\n  return this;\n};\n\nAlgoliaSearchHelper.prototype.searchOnlyWithDerivedHelpers = function () {\n  this._search({ onlyWithDerivedHelpers: true });\n  return this;\n};\n\n/**\n * Gets the search query parameters that would be sent to the Algolia Client\n * for the hits\n * @return {object} Query Parameters\n */\nAlgoliaSearchHelper.prototype.getQuery = function () {\n  var state = this.state;\n  return requestBuilder._getHitsSearchParams(state);\n};\n\n/**\n * Start a search using a modified version of the current state. This method does\n * not trigger the helper lifecycle and does not modify the state kept internally\n * by the helper. This second aspect means that the next search call will be the\n * same as a search call before calling searchOnce.\n * @param {object} options can contain all the parameters that can be set to SearchParameters\n * plus the index\n * @param {function} [cb] optional callback executed when the response from the\n * server is back.\n * @return {promise|undefined} if a callback is passed the method returns undefined\n * otherwise it returns a promise containing an object with two keys :\n *  - content with a SearchResults\n *  - state with the state used for the query as a SearchParameters\n * @example\n * // Changing the number of records returned per page to 1\n * // This example uses the callback API\n * var state = helper.searchOnce({hitsPerPage: 1},\n *   function(error, content, state) {\n *     // if an error occurred it will be passed in error, otherwise its value is null\n *     // content contains the results formatted as a SearchResults\n *     // state is the instance of SearchParameters used for this search\n *   });\n * @example\n * // Changing the number of records returned per page to 1\n * // This example uses the promise API\n * var state1 = helper.searchOnce({hitsPerPage: 1})\n *                 .then(promiseHandler);\n *\n * function promiseHandler(res) {\n *   // res contains\n *   // {\n *   //   content : SearchResults\n *   //   state   : SearchParameters (the one used for this specific search)\n *   // }\n * }\n */\nAlgoliaSearchHelper.prototype.searchOnce = function (options, cb) {\n  var tempState = !options\n    ? this.state\n    : this.state.setQueryParameters(options);\n  var queries = requestBuilder._getQueries(tempState.index, tempState);\n  // eslint-disable-next-line consistent-this\n  var self = this;\n\n  this._currentNbQueries++;\n\n  this.emit('searchOnce', {\n    state: tempState,\n  });\n\n  if (cb) {\n    this.client\n      .search(queries)\n      .then(function (content) {\n        self._currentNbQueries--;\n        if (self._currentNbQueries === 0) {\n          self.emit('searchQueueEmpty');\n        }\n\n        cb(null, new SearchResults(tempState, content.results), tempState);\n      })\n      .catch(function (err) {\n        self._currentNbQueries--;\n        if (self._currentNbQueries === 0) {\n          self.emit('searchQueueEmpty');\n        }\n\n        cb(err, null, tempState);\n      });\n\n    return undefined;\n  }\n\n  return this.client.search(queries).then(\n    function (content) {\n      self._currentNbQueries--;\n      if (self._currentNbQueries === 0) self.emit('searchQueueEmpty');\n      return {\n        content: new SearchResults(tempState, content.results),\n        state: tempState,\n        _originalResponse: content,\n      };\n    },\n    function (e) {\n      self._currentNbQueries--;\n      if (self._currentNbQueries === 0) self.emit('searchQueueEmpty');\n      throw e;\n    }\n  );\n};\n\n/**\n * Start the search for answers with the parameters set in the state.\n * This method returns a promise.\n * @param {Object} options - the options for answers API call\n * @param {string[]} options.attributesForPrediction - Attributes to use for predictions. If empty, `searchableAttributes` is used instead.\n * @param {string[]} options.queryLanguages - The languages in the query. Currently only supports ['en'].\n * @param {number} options.nbHits - Maximum number of answers to retrieve from the Answers Engine. Cannot be greater than 1000.\n *\n * @return {promise} the answer results\n * @deprecated answers is deprecated and will be replaced with new initiatives\n */\nAlgoliaSearchHelper.prototype.findAnswers = function (options) {\n  // eslint-disable-next-line no-console\n  console.warn('[algoliasearch-helper] answers is no longer supported');\n  var state = this.state;\n  var derivedHelper = this.derivedHelpers[0];\n  if (!derivedHelper) {\n    return Promise.resolve([]);\n  }\n  var derivedState = derivedHelper.getModifiedState(state);\n  var data = merge(\n    {\n      attributesForPrediction: options.attributesForPrediction,\n      nbHits: options.nbHits,\n    },\n    {\n      params: omit(requestBuilder._getHitsSearchParams(derivedState), [\n        'attributesToSnippet',\n        'hitsPerPage',\n        'restrictSearchableAttributes',\n        'snippetEllipsisText',\n      ]),\n    }\n  );\n\n  var errorMessage =\n    'search for answers was called, but this client does not have a function client.initIndex(index).findAnswers';\n  if (typeof this.client.initIndex !== 'function') {\n    throw new Error(errorMessage);\n  }\n  var index = this.client.initIndex(derivedState.index);\n  if (typeof index.findAnswers !== 'function') {\n    throw new Error(errorMessage);\n  }\n  return index.findAnswers(derivedState.query, options.queryLanguages, data);\n};\n\n/**\n * Structure of each result when using\n * [`searchForFacetValues()`](reference.html#AlgoliaSearchHelper#searchForFacetValues)\n * @typedef FacetSearchHit\n * @type {object}\n * @property {string} value the facet value\n * @property {string} highlighted the facet value highlighted with the query string\n * @property {number} count number of occurrence of this facet value\n * @property {boolean} isRefined true if the value is already refined\n */\n\n/**\n * Structure of the data resolved by the\n * [`searchForFacetValues()`](reference.html#AlgoliaSearchHelper#searchForFacetValues)\n * promise.\n * @typedef FacetSearchResult\n * @type {object}\n * @property {FacetSearchHit} facetHits the results for this search for facet values\n * @property {number} processingTimeMS time taken by the query inside the engine\n */\n\n/**\n * Search for facet values based on an query and the name of a faceted attribute. This\n * triggers a search and will return a promise. On top of using the query, it also sends\n * the parameters from the state so that the search is narrowed down to only the possible values.\n *\n * See the description of [FacetSearchResult](reference.html#FacetSearchResult)\n * @param {string} facet the name of the faceted attribute\n * @param {string} query the string query for the search\n * @param {number} [maxFacetHits] the maximum number values returned. Should be > 0 and <= 100\n * @param {object} [userState] the set of custom parameters to use on top of the current state. Setting a property to `undefined` removes\n * it in the generated query.\n * @return {promise.<FacetSearchResult>} the results of the search\n */\nAlgoliaSearchHelper.prototype.searchForFacetValues = function (\n  facet,\n  query,\n  maxFacetHits,\n  userState\n) {\n  var clientHasSFFV = typeof this.client.searchForFacetValues === 'function';\n  var clientHasInitIndex = typeof this.client.initIndex === 'function';\n  if (\n    !clientHasSFFV &&\n    !clientHasInitIndex &&\n    typeof this.client.search !== 'function'\n  ) {\n    throw new Error(\n      'search for facet values (searchable) was called, but this client does not have a function client.searchForFacetValues or client.initIndex(index).searchForFacetValues'\n    );\n  }\n\n  var state = this.state.setQueryParameters(userState || {});\n  var isDisjunctive = state.isDisjunctiveFacet(facet);\n  var algoliaQuery = requestBuilder.getSearchForFacetQuery(\n    facet,\n    query,\n    maxFacetHits,\n    state\n  );\n\n  this._currentNbQueries++;\n  // eslint-disable-next-line consistent-this\n  var self = this;\n  var searchForFacetValuesPromise;\n  // newer algoliasearch ^3.27.1 - ~4.0.0\n  if (clientHasSFFV) {\n    searchForFacetValuesPromise = this.client.searchForFacetValues([\n      { indexName: state.index, params: algoliaQuery },\n    ]);\n    // algoliasearch < 3.27.1\n  } else if (clientHasInitIndex) {\n    searchForFacetValuesPromise = this.client\n      .initIndex(state.index)\n      .searchForFacetValues(algoliaQuery);\n    // algoliasearch ~5.0.0\n  } else {\n    // @MAJOR only use client.search\n    delete algoliaQuery.facetName;\n    searchForFacetValuesPromise = this.client\n      .search([\n        {\n          type: 'facet',\n          facet: facet,\n          indexName: state.index,\n          params: algoliaQuery,\n        },\n      ])\n      .then(function processResponse(response) {\n        return response.results[0];\n      });\n  }\n\n  this.emit('searchForFacetValues', {\n    state: state,\n    facet: facet,\n    query: query,\n  });\n\n  return searchForFacetValuesPromise.then(\n    function addIsRefined(content) {\n      self._currentNbQueries--;\n      if (self._currentNbQueries === 0) self.emit('searchQueueEmpty');\n\n      content = Array.isArray(content) ? content[0] : content;\n\n      content.facetHits.forEach(function (f) {\n        f.escapedValue = escapeFacetValue(f.value);\n        f.isRefined = isDisjunctive\n          ? state.isDisjunctiveFacetRefined(facet, f.escapedValue)\n          : state.isFacetRefined(facet, f.escapedValue);\n      });\n\n      return content;\n    },\n    function (e) {\n      self._currentNbQueries--;\n      if (self._currentNbQueries === 0) self.emit('searchQueueEmpty');\n      throw e;\n    }\n  );\n};\n\n/**\n * Sets the text query used for the search.\n *\n * This method resets the current page to 0.\n * @param  {string} q the user query\n * @return {AlgoliaSearchHelper} Method is chainable, it returns itself\n * @fires change\n * @chainable\n */\nAlgoliaSearchHelper.prototype.setQuery = function (q) {\n  this._change({\n    state: this.state.resetPage().setQuery(q),\n    isPageReset: true,\n  });\n\n  return this;\n};\n\n/**\n * Remove all the types of refinements except tags. A string can be provided to remove\n * only the refinements of a specific attribute. For more advanced use case, you can\n * provide a function instead. This function should follow the\n * [clearCallback definition](#SearchParameters.clearCallback).\n *\n * This method resets the current page to 0.\n * @param {string} [name] optional name of the facet / attribute on which we want to remove all refinements\n * @return {AlgoliaSearchHelper} Method is chainable, it returns itself\n * @fires change\n * @chainable\n * @example\n * // Removing all the refinements\n * helper.clearRefinements().search();\n * @example\n * // Removing all the filters on a the category attribute.\n * helper.clearRefinements('category').search();\n * @example\n * // Removing only the exclude filters on the category facet.\n * helper.clearRefinements(function(value, attribute, type) {\n *   return type === 'exclude' && attribute === 'category';\n * }).search();\n */\nAlgoliaSearchHelper.prototype.clearRefinements = function (name) {\n  this._change({\n    state: this.state.resetPage().clearRefinements(name),\n    isPageReset: true,\n  });\n\n  return this;\n};\n\n/**\n * Remove all the tag filters.\n *\n * This method resets the current page to 0.\n * @return {AlgoliaSearchHelper} Method is chainable, it returns itself\n * @fires change\n * @chainable\n */\nAlgoliaSearchHelper.prototype.clearTags = function () {\n  this._change({\n    state: this.state.resetPage().clearTags(),\n    isPageReset: true,\n  });\n\n  return this;\n};\n\n/**\n * Adds a disjunctive filter to a faceted attribute with the `value` provided. If the\n * filter is already set, it doesn't change the filters.\n *\n * This method resets the current page to 0.\n * @param  {string} facet the facet to refine\n * @param  {string} value the associated value (will be converted to string)\n * @return {AlgoliaSearchHelper} Method is chainable, it returns itself\n * @fires change\n * @chainable\n */\nAlgoliaSearchHelper.prototype.addDisjunctiveFacetRefinement = function (\n  facet,\n  value\n) {\n  this._change({\n    state: this.state.resetPage().addDisjunctiveFacetRefinement(facet, value),\n    isPageReset: true,\n  });\n\n  return this;\n};\n\n// eslint-disable-next-line valid-jsdoc\n/**\n * @deprecated since version 2.4.0, see {@link AlgoliaSearchHelper#addDisjunctiveFacetRefinement}\n */\nAlgoliaSearchHelper.prototype.addDisjunctiveRefine = function () {\n  return this.addDisjunctiveFacetRefinement.apply(this, arguments);\n};\n\n/**\n * Adds a refinement on a hierarchical facet. It will throw\n * an exception if the facet is not defined or if the facet\n * is already refined.\n *\n * This method resets the current page to 0.\n * @param {string} facet the facet name\n * @param {string} path the hierarchical facet path\n * @return {AlgoliaSearchHelper} Method is chainable, it returns itself\n * @throws Error if the facet is not defined or if the facet is refined\n * @chainable\n * @fires change\n */\nAlgoliaSearchHelper.prototype.addHierarchicalFacetRefinement = function (\n  facet,\n  path\n) {\n  this._change({\n    state: this.state.resetPage().addHierarchicalFacetRefinement(facet, path),\n    isPageReset: true,\n  });\n\n  return this;\n};\n\n/**\n * Adds a an numeric filter to an attribute with the `operator` and `value` provided. If the\n * filter is already set, it doesn't change the filters.\n *\n * This method resets the current page to 0.\n * @param  {string} attribute the attribute on which the numeric filter applies\n * @param  {string} operator the operator of the filter\n * @param  {number} value the value of the filter\n * @return {AlgoliaSearchHelper} Method is chainable, it returns itself\n * @fires change\n * @chainable\n */\nAlgoliaSearchHelper.prototype.addNumericRefinement = function (\n  attribute,\n  operator,\n  value\n) {\n  this._change({\n    state: this.state\n      .resetPage()\n      .addNumericRefinement(attribute, operator, value),\n    isPageReset: true,\n  });\n\n  return this;\n};\n\n/**\n * Adds a filter to a faceted attribute with the `value` provided. If the\n * filter is already set, it doesn't change the filters.\n *\n * This method resets the current page to 0.\n * @param  {string} facet the facet to refine\n * @param  {string} value the associated value (will be converted to string)\n * @return {AlgoliaSearchHelper} Method is chainable, it returns itself\n * @fires change\n * @chainable\n */\nAlgoliaSearchHelper.prototype.addFacetRefinement = function (facet, value) {\n  this._change({\n    state: this.state.resetPage().addFacetRefinement(facet, value),\n    isPageReset: true,\n  });\n\n  return this;\n};\n\n// eslint-disable-next-line valid-jsdoc\n/**\n * @deprecated since version 2.4.0, see {@link AlgoliaSearchHelper#addFacetRefinement}\n */\nAlgoliaSearchHelper.prototype.addRefine = function () {\n  return this.addFacetRefinement.apply(this, arguments);\n};\n\n/**\n * Adds a an exclusion filter to a faceted attribute with the `value` provided. If the\n * filter is already set, it doesn't change the filters.\n *\n * This method resets the current page to 0.\n * @param  {string} facet the facet to refine\n * @param  {string} value the associated value (will be converted to string)\n * @return {AlgoliaSearchHelper} Method is chainable, it returns itself\n * @fires change\n * @chainable\n */\nAlgoliaSearchHelper.prototype.addFacetExclusion = function (facet, value) {\n  this._change({\n    state: this.state.resetPage().addExcludeRefinement(facet, value),\n    isPageReset: true,\n  });\n\n  return this;\n};\n\n// eslint-disable-next-line valid-jsdoc\n/**\n * @deprecated since version 2.4.0, see {@link AlgoliaSearchHelper#addFacetExclusion}\n */\nAlgoliaSearchHelper.prototype.addExclude = function () {\n  return this.addFacetExclusion.apply(this, arguments);\n};\n\n/**\n * Adds a tag filter with the `tag` provided. If the\n * filter is already set, it doesn't change the filters.\n *\n * This method resets the current page to 0.\n * @param {string} tag the tag to add to the filter\n * @return {AlgoliaSearchHelper} Method is chainable, it returns itself\n * @fires change\n * @chainable\n */\nAlgoliaSearchHelper.prototype.addTag = function (tag) {\n  this._change({\n    state: this.state.resetPage().addTagRefinement(tag),\n    isPageReset: true,\n  });\n\n  return this;\n};\n\n/**\n * Removes an numeric filter to an attribute with the `operator` and `value` provided. If the\n * filter is not set, it doesn't change the filters.\n *\n * Some parameters are optional, triggering different behavior:\n *  - if the value is not provided, then all the numeric value will be removed for the\n *  specified attribute/operator couple.\n *  - if the operator is not provided either, then all the numeric filter on this attribute\n *  will be removed.\n *\n * This method resets the current page to 0.\n * @param  {string} attribute the attribute on which the numeric filter applies\n * @param  {string} [operator] the operator of the filter\n * @param  {number} [value] the value of the filter\n * @return {AlgoliaSearchHelper} Method is chainable, it returns itself\n * @fires change\n * @chainable\n */\nAlgoliaSearchHelper.prototype.removeNumericRefinement = function (\n  attribute,\n  operator,\n  value\n) {\n  this._change({\n    state: this.state\n      .resetPage()\n      .removeNumericRefinement(attribute, operator, value),\n    isPageReset: true,\n  });\n\n  return this;\n};\n\n/**\n * Removes a disjunctive filter to a faceted attribute with the `value` provided. If the\n * filter is not set, it doesn't change the filters.\n *\n * If the value is omitted, then this method will remove all the filters for the\n * attribute.\n *\n * This method resets the current page to 0.\n * @param  {string} facet the facet to refine\n * @param  {string} [value] the associated value\n * @return {AlgoliaSearchHelper} Method is chainable, it returns itself\n * @fires change\n * @chainable\n */\nAlgoliaSearchHelper.prototype.removeDisjunctiveFacetRefinement = function (\n  facet,\n  value\n) {\n  this._change({\n    state: this.state\n      .resetPage()\n      .removeDisjunctiveFacetRefinement(facet, value),\n    isPageReset: true,\n  });\n\n  return this;\n};\n\n// eslint-disable-next-line valid-jsdoc\n/**\n * @deprecated since version 2.4.0, see {@link AlgoliaSearchHelper#removeDisjunctiveFacetRefinement}\n */\nAlgoliaSearchHelper.prototype.removeDisjunctiveRefine = function () {\n  return this.removeDisjunctiveFacetRefinement.apply(this, arguments);\n};\n\n/**\n * Removes the refinement set on a hierarchical facet.\n * @param {string} facet the facet name\n * @return {AlgoliaSearchHelper} Method is chainable, it returns itself\n * @throws Error if the facet is not defined or if the facet is not refined\n * @fires change\n * @chainable\n */\nAlgoliaSearchHelper.prototype.removeHierarchicalFacetRefinement = function (\n  facet\n) {\n  this._change({\n    state: this.state.resetPage().removeHierarchicalFacetRefinement(facet),\n    isPageReset: true,\n  });\n\n  return this;\n};\n\n/**\n * Removes a filter to a faceted attribute with the `value` provided. If the\n * filter is not set, it doesn't change the filters.\n *\n * If the value is omitted, then this method will remove all the filters for the\n * attribute.\n *\n * This method resets the current page to 0.\n * @param  {string} facet the facet to refine\n * @param  {string} [value] the associated value\n * @return {AlgoliaSearchHelper} Method is chainable, it returns itself\n * @fires change\n * @chainable\n */\nAlgoliaSearchHelper.prototype.removeFacetRefinement = function (facet, value) {\n  this._change({\n    state: this.state.resetPage().removeFacetRefinement(facet, value),\n    isPageReset: true,\n  });\n\n  return this;\n};\n\n// eslint-disable-next-line valid-jsdoc\n/**\n * @deprecated since version 2.4.0, see {@link AlgoliaSearchHelper#removeFacetRefinement}\n */\nAlgoliaSearchHelper.prototype.removeRefine = function () {\n  return this.removeFacetRefinement.apply(this, arguments);\n};\n\n/**\n * Removes an exclusion filter to a faceted attribute with the `value` provided. If the\n * filter is not set, it doesn't change the filters.\n *\n * If the value is omitted, then this method will remove all the filters for the\n * attribute.\n *\n * This method resets the current page to 0.\n * @param  {string} facet the facet to refine\n * @param  {string} [value] the associated value\n * @return {AlgoliaSearchHelper} Method is chainable, it returns itself\n * @fires change\n * @chainable\n */\nAlgoliaSearchHelper.prototype.removeFacetExclusion = function (facet, value) {\n  this._change({\n    state: this.state.resetPage().removeExcludeRefinement(facet, value),\n    isPageReset: true,\n  });\n\n  return this;\n};\n\n// eslint-disable-next-line valid-jsdoc\n/**\n * @deprecated since version 2.4.0, see {@link AlgoliaSearchHelper#removeFacetExclusion}\n */\nAlgoliaSearchHelper.prototype.removeExclude = function () {\n  return this.removeFacetExclusion.apply(this, arguments);\n};\n\n/**\n * Removes a tag filter with the `tag` provided. If the\n * filter is not set, it doesn't change the filters.\n *\n * This method resets the current page to 0.\n * @param {string} tag tag to remove from the filter\n * @return {AlgoliaSearchHelper} Method is chainable, it returns itself\n * @fires change\n * @chainable\n */\nAlgoliaSearchHelper.prototype.removeTag = function (tag) {\n  this._change({\n    state: this.state.resetPage().removeTagRefinement(tag),\n    isPageReset: true,\n  });\n\n  return this;\n};\n\n/**\n * Adds or removes an exclusion filter to a faceted attribute with the `value` provided. If\n * the value is set then it removes it, otherwise it adds the filter.\n *\n * This method resets the current page to 0.\n * @param  {string} facet the facet to refine\n * @param  {string} value the associated value\n * @return {AlgoliaSearchHelper} Method is chainable, it returns itself\n * @fires change\n * @chainable\n */\nAlgoliaSearchHelper.prototype.toggleFacetExclusion = function (facet, value) {\n  this._change({\n    state: this.state.resetPage().toggleExcludeFacetRefinement(facet, value),\n    isPageReset: true,\n  });\n\n  return this;\n};\n\n// eslint-disable-next-line valid-jsdoc\n/**\n * @deprecated since version 2.4.0, see {@link AlgoliaSearchHelper#toggleFacetExclusion}\n */\nAlgoliaSearchHelper.prototype.toggleExclude = function () {\n  return this.toggleFacetExclusion.apply(this, arguments);\n};\n\n/**\n * Adds or removes a filter to a faceted attribute with the `value` provided. If\n * the value is set then it removes it, otherwise it adds the filter.\n *\n * This method can be used for conjunctive, disjunctive and hierarchical filters.\n *\n * This method resets the current page to 0.\n * @param  {string} facet the facet to refine\n * @param  {string} value the associated value\n * @return {AlgoliaSearchHelper} Method is chainable, it returns itself\n * @throws Error will throw an error if the facet is not declared in the settings of the helper\n * @fires change\n * @chainable\n * @deprecated since version 2.19.0, see {@link AlgoliaSearchHelper#toggleFacetRefinement}\n */\nAlgoliaSearchHelper.prototype.toggleRefinement = function (facet, value) {\n  return this.toggleFacetRefinement(facet, value);\n};\n\n/**\n * Adds or removes a filter to a faceted attribute with the `value` provided. If\n * the value is set then it removes it, otherwise it adds the filter.\n *\n * This method can be used for conjunctive, disjunctive and hierarchical filters.\n *\n * This method resets the current page to 0.\n * @param  {string} facet the facet to refine\n * @param  {string} value the associated value\n * @return {AlgoliaSearchHelper} Method is chainable, it returns itself\n * @throws Error will throw an error if the facet is not declared in the settings of the helper\n * @fires change\n * @chainable\n */\nAlgoliaSearchHelper.prototype.toggleFacetRefinement = function (facet, value) {\n  this._change({\n    state: this.state.resetPage().toggleFacetRefinement(facet, value),\n    isPageReset: true,\n  });\n\n  return this;\n};\n\n// eslint-disable-next-line valid-jsdoc\n/**\n * @deprecated since version 2.4.0, see {@link AlgoliaSearchHelper#toggleFacetRefinement}\n */\nAlgoliaSearchHelper.prototype.toggleRefine = function () {\n  return this.toggleFacetRefinement.apply(this, arguments);\n};\n\n/**\n * Adds or removes a tag filter with the `value` provided. If\n * the value is set then it removes it, otherwise it adds the filter.\n *\n * This method resets the current page to 0.\n * @param {string} tag tag to remove or add\n * @return {AlgoliaSearchHelper} Method is chainable, it returns itself\n * @fires change\n * @chainable\n */\nAlgoliaSearchHelper.prototype.toggleTag = function (tag) {\n  this._change({\n    state: this.state.resetPage().toggleTagRefinement(tag),\n    isPageReset: true,\n  });\n\n  return this;\n};\n\n/**\n * Increments the page number by one.\n * @return {AlgoliaSearchHelper} Method is chainable, it returns itself\n * @fires change\n * @chainable\n * @example\n * helper.setPage(0).nextPage().getPage();\n * // returns 1\n */\nAlgoliaSearchHelper.prototype.nextPage = function () {\n  var page = this.state.page || 0;\n  return this.setPage(page + 1);\n};\n\n/**\n * Decrements the page number by one.\n * @fires change\n * @return {AlgoliaSearchHelper} Method is chainable, it returns itself\n * @chainable\n * @example\n * helper.setPage(1).previousPage().getPage();\n * // returns 0\n */\nAlgoliaSearchHelper.prototype.previousPage = function () {\n  var page = this.state.page || 0;\n  return this.setPage(page - 1);\n};\n\n/**\n * @private\n * @param {number} page The page number\n * @return {AlgoliaSearchHelper} Method is chainable, it returns itself\n * @chainable\n * @fires change\n */\nfunction setCurrentPage(page) {\n  if (page < 0) throw new Error('Page requested below 0.');\n\n  this._change({\n    state: this.state.setPage(page),\n    isPageReset: false,\n  });\n\n  return this;\n}\n\n/**\n * Change the current page\n * @deprecated\n * @param  {number} page The page number\n * @return {AlgoliaSearchHelper} Method is chainable, it returns itself\n * @fires change\n * @chainable\n */\nAlgoliaSearchHelper.prototype.setCurrentPage = setCurrentPage;\n\n/**\n * Updates the current page.\n * @function\n * @param  {number} page The page number\n * @return {AlgoliaSearchHelper} Method is chainable, it returns itself\n * @fires change\n * @chainable\n */\nAlgoliaSearchHelper.prototype.setPage = setCurrentPage;\n\n/**\n * Updates the name of the index that will be targeted by the query.\n *\n * This method resets the current page to 0.\n * @param {string} name the index name\n * @return {AlgoliaSearchHelper} Method is chainable, it returns itself\n * @fires change\n * @chainable\n */\nAlgoliaSearchHelper.prototype.setIndex = function (name) {\n  this._change({\n    state: this.state.resetPage().setIndex(name),\n    isPageReset: true,\n  });\n\n  return this;\n};\n\n/**\n * Update a parameter of the search. This method reset the page\n *\n * The complete list of parameters is available on the\n * [Algolia website](https://www.algolia.com/doc/rest#query-an-index).\n * The most commonly used parameters have their own [shortcuts](#query-parameters-shortcuts)\n * or benefit from higher-level APIs (all the kind of filters and facets have their own API)\n *\n * This method resets the current page to 0.\n * @param {string} parameter name of the parameter to update\n * @param {any} value new value of the parameter\n * @return {AlgoliaSearchHelper} Method is chainable, it returns itself\n * @fires change\n * @chainable\n * @example\n * helper.setQueryParameter('hitsPerPage', 20).search();\n */\nAlgoliaSearchHelper.prototype.setQueryParameter = function (parameter, value) {\n  this._change({\n    state: this.state.resetPage().setQueryParameter(parameter, value),\n    isPageReset: true,\n  });\n\n  return this;\n};\n\n/**\n * Set the whole state (warning: will erase previous state)\n * @param {SearchParameters} newState the whole new state\n * @return {AlgoliaSearchHelper} Method is chainable, it returns itself\n * @fires change\n * @chainable\n */\nAlgoliaSearchHelper.prototype.setState = function (newState) {\n  this._change({\n    state: SearchParameters.make(newState),\n    isPageReset: false,\n  });\n\n  return this;\n};\n\n/**\n * Override the current state without triggering a change event.\n * Do not use this method unless you know what you are doing. (see the example\n * for a legit use case)\n * @param {SearchParameters} newState the whole new state\n * @return {AlgoliaSearchHelper} Method is chainable, it returns itself\n * @example\n *  helper.on('change', function(state){\n *    // In this function you might want to find a way to store the state in the url/history\n *    updateYourURL(state)\n *  })\n *  window.onpopstate = function(event){\n *    // This is naive though as you should check if the state is really defined etc.\n *    helper.overrideStateWithoutTriggeringChangeEvent(event.state).search()\n *  }\n * @chainable\n */\nAlgoliaSearchHelper.prototype.overrideStateWithoutTriggeringChangeEvent =\n  function (newState) {\n    this.state = new SearchParameters(newState);\n    return this;\n  };\n\n/**\n * Check if an attribute has any numeric, conjunctive, disjunctive or hierarchical filters.\n * @param {string} attribute the name of the attribute\n * @return {boolean} true if the attribute is filtered by at least one value\n * @example\n * // hasRefinements works with numeric, conjunctive, disjunctive and hierarchical filters\n * helper.hasRefinements('price'); // false\n * helper.addNumericRefinement('price', '>', 100);\n * helper.hasRefinements('price'); // true\n *\n * helper.hasRefinements('color'); // false\n * helper.addFacetRefinement('color', 'blue');\n * helper.hasRefinements('color'); // true\n *\n * helper.hasRefinements('material'); // false\n * helper.addDisjunctiveFacetRefinement('material', 'plastic');\n * helper.hasRefinements('material'); // true\n *\n * helper.hasRefinements('categories'); // false\n * helper.toggleFacetRefinement('categories', 'kitchen > knife');\n * helper.hasRefinements('categories'); // true\n *\n */\nAlgoliaSearchHelper.prototype.hasRefinements = function (attribute) {\n  if (objectHasKeys(this.state.getNumericRefinements(attribute))) {\n    return true;\n  } else if (this.state.isConjunctiveFacet(attribute)) {\n    return this.state.isFacetRefined(attribute);\n  } else if (this.state.isDisjunctiveFacet(attribute)) {\n    return this.state.isDisjunctiveFacetRefined(attribute);\n  } else if (this.state.isHierarchicalFacet(attribute)) {\n    return this.state.isHierarchicalFacetRefined(attribute);\n  }\n\n  // there's currently no way to know that the user did call `addNumericRefinement` at some point\n  // thus we cannot distinguish if there once was a numeric refinement that was cleared\n  // so we will return false in every other situations to be consistent\n  // while what we should do here is throw because we did not find the attribute in any type\n  // of refinement\n  return false;\n};\n\n/**\n * Check if a value is excluded for a specific faceted attribute. If the value\n * is omitted then the function checks if there is any excluding refinements.\n *\n * @param  {string}  facet name of the attribute for used for faceting\n * @param  {string}  [value] optional value. If passed will test that this value\n * is filtering the given facet.\n * @return {boolean} true if refined\n * @example\n * helper.isExcludeRefined('color'); // false\n * helper.isExcludeRefined('color', 'blue') // false\n * helper.isExcludeRefined('color', 'red') // false\n *\n * helper.addFacetExclusion('color', 'red');\n *\n * helper.isExcludeRefined('color'); // true\n * helper.isExcludeRefined('color', 'blue') // false\n * helper.isExcludeRefined('color', 'red') // true\n */\nAlgoliaSearchHelper.prototype.isExcluded = function (facet, value) {\n  return this.state.isExcludeRefined(facet, value);\n};\n\n// eslint-disable-next-line valid-jsdoc\n/**\n * @deprecated since 2.4.0, see {@link AlgoliaSearchHelper#hasRefinements}\n */\nAlgoliaSearchHelper.prototype.isDisjunctiveRefined = function (facet, value) {\n  return this.state.isDisjunctiveFacetRefined(facet, value);\n};\n\n/**\n * Check if the string is a currently filtering tag.\n * @param {string} tag tag to check\n * @return {boolean} true if the tag is currently refined\n */\nAlgoliaSearchHelper.prototype.hasTag = function (tag) {\n  return this.state.isTagRefined(tag);\n};\n\n// eslint-disable-next-line valid-jsdoc\n/**\n * @deprecated since 2.4.0, see {@link AlgoliaSearchHelper#hasTag}\n */\nAlgoliaSearchHelper.prototype.isTagRefined = function () {\n  return this.hasTagRefinements.apply(this, arguments);\n};\n\n/**\n * Get the name of the currently used index.\n * @return {string} name of the index\n * @example\n * helper.setIndex('highestPrice_products').getIndex();\n * // returns 'highestPrice_products'\n */\nAlgoliaSearchHelper.prototype.getIndex = function () {\n  return this.state.index;\n};\n\nfunction getCurrentPage() {\n  return this.state.page;\n}\n\n/**\n * Get the currently selected page\n * @deprecated\n * @return {number} the current page\n */\nAlgoliaSearchHelper.prototype.getCurrentPage = getCurrentPage;\n/**\n * Get the currently selected page\n * @function\n * @return {number} the current page\n */\nAlgoliaSearchHelper.prototype.getPage = getCurrentPage;\n\n/**\n * Get all the tags currently set to filters the results.\n *\n * @return {string[]} The list of tags currently set.\n */\nAlgoliaSearchHelper.prototype.getTags = function () {\n  return this.state.tagRefinements;\n};\n\n/**\n * Get the list of refinements for a given attribute. This method works with\n * conjunctive, disjunctive, excluding and numerical filters.\n *\n * See also SearchResults#getRefinements\n *\n * @param {string} facetName attribute name used for faceting\n * @return {Array.<FacetRefinement|NumericRefinement>} All Refinement are objects that contain a value, and\n * a type. Numeric also contains an operator.\n * @example\n * helper.addNumericRefinement('price', '>', 100);\n * helper.getRefinements('price');\n * // [\n * //   {\n * //     \"value\": [\n * //       100\n * //     ],\n * //     \"operator\": \">\",\n * //     \"type\": \"numeric\"\n * //   }\n * // ]\n * @example\n * helper.addFacetRefinement('color', 'blue');\n * helper.addFacetExclusion('color', 'red');\n * helper.getRefinements('color');\n * // [\n * //   {\n * //     \"value\": \"blue\",\n * //     \"type\": \"conjunctive\"\n * //   },\n * //   {\n * //     \"value\": \"red\",\n * //     \"type\": \"exclude\"\n * //   }\n * // ]\n * @example\n * helper.addDisjunctiveFacetRefinement('material', 'plastic');\n * // [\n * //   {\n * //     \"value\": \"plastic\",\n * //     \"type\": \"disjunctive\"\n * //   }\n * // ]\n */\nAlgoliaSearchHelper.prototype.getRefinements = function (facetName) {\n  var refinements = [];\n\n  if (this.state.isConjunctiveFacet(facetName)) {\n    var conjRefinements = this.state.getConjunctiveRefinements(facetName);\n\n    conjRefinements.forEach(function (r) {\n      refinements.push({\n        value: r,\n        type: 'conjunctive',\n      });\n    });\n\n    var excludeRefinements = this.state.getExcludeRefinements(facetName);\n\n    excludeRefinements.forEach(function (r) {\n      refinements.push({\n        value: r,\n        type: 'exclude',\n      });\n    });\n  } else if (this.state.isDisjunctiveFacet(facetName)) {\n    var disjunctiveRefinements =\n      this.state.getDisjunctiveRefinements(facetName);\n\n    disjunctiveRefinements.forEach(function (r) {\n      refinements.push({\n        value: r,\n        type: 'disjunctive',\n      });\n    });\n  }\n\n  var numericRefinements = this.state.getNumericRefinements(facetName);\n\n  Object.keys(numericRefinements).forEach(function (operator) {\n    var value = numericRefinements[operator];\n\n    refinements.push({\n      value: value,\n      operator: operator,\n      type: 'numeric',\n    });\n  });\n\n  return refinements;\n};\n\n/**\n * Return the current refinement for the (attribute, operator)\n * @param {string} attribute attribute in the record\n * @param {string} operator operator applied on the refined values\n * @return {Array.<number|number[]>} refined values\n */\nAlgoliaSearchHelper.prototype.getNumericRefinement = function (\n  attribute,\n  operator\n) {\n  return this.state.getNumericRefinement(attribute, operator);\n};\n\n/**\n * Get the current breadcrumb for a hierarchical facet, as an array\n * @param  {string} facetName Hierarchical facet name\n * @return {array.<string>} the path as an array of string\n */\nAlgoliaSearchHelper.prototype.getHierarchicalFacetBreadcrumb = function (\n  facetName\n) {\n  return this.state.getHierarchicalFacetBreadcrumb(facetName);\n};\n\n// /////////// PRIVATE\n\n/**\n * Perform the underlying queries\n * @private\n * @param {object} options options for the query\n * @param {boolean} [options.onlyWithDerivedHelpers=false] if true, only the derived helpers will be queried\n * @return {undefined} does not return anything\n * @fires search\n * @fires result\n * @fires error\n */\nAlgoliaSearchHelper.prototype._search = function (options) {\n  var state = this.state;\n  var states = [];\n  var mainQueries = [];\n\n  if (!options.onlyWithDerivedHelpers) {\n    mainQueries = requestBuilder._getQueries(state.index, state);\n\n    states.push({\n      state: state,\n      queriesCount: mainQueries.length,\n      helper: this,\n    });\n\n    this.emit('search', {\n      state: state,\n      results: this.lastResults,\n    });\n  }\n\n  var derivedQueries = this.derivedHelpers.map(function (derivedHelper) {\n    var derivedState = derivedHelper.getModifiedState(state);\n    var derivedStateQueries = derivedState.index\n      ? requestBuilder._getQueries(derivedState.index, derivedState)\n      : [];\n\n    states.push({\n      state: derivedState,\n      queriesCount: derivedStateQueries.length,\n      helper: derivedHelper,\n    });\n\n    derivedHelper.emit('search', {\n      state: derivedState,\n      results: derivedHelper.lastResults,\n    });\n\n    return derivedStateQueries;\n  });\n\n  var queries = Array.prototype.concat.apply(mainQueries, derivedQueries);\n\n  var queryId = this._queryId++;\n  this._currentNbQueries++;\n\n  if (!queries.length) {\n    return Promise.resolve({ results: [] }).then(\n      this._dispatchAlgoliaResponse.bind(this, states, queryId)\n    );\n  }\n\n  try {\n    this.client\n      .search(queries)\n      .then(this._dispatchAlgoliaResponse.bind(this, states, queryId))\n      .catch(this._dispatchAlgoliaError.bind(this, queryId));\n  } catch (error) {\n    // If we reach this part, we're in an internal error state\n    this.emit('error', {\n      error: error,\n    });\n  }\n\n  return undefined;\n};\n\n/**\n * Transform the responses as sent by the server and transform them into a user\n * usable object that merge the results of all the batch requests. It will dispatch\n * over the different helper + derived helpers (when there are some).\n * @private\n * @param {array.<{SearchParameters, AlgoliaQueries, AlgoliaSearchHelper}>} states state used to generate the request\n * @param {number} queryId id of the current request\n * @param {object} content content of the response\n * @return {undefined}\n */\nAlgoliaSearchHelper.prototype._dispatchAlgoliaResponse = function (\n  states,\n  queryId,\n  content\n) {\n  // @TODO remove the number of outdated queries discarded instead of just one\n\n  if (queryId < this._lastQueryIdReceived) {\n    // Outdated answer\n    return;\n  }\n\n  this._currentNbQueries -= queryId - this._lastQueryIdReceived;\n  this._lastQueryIdReceived = queryId;\n\n  if (this._currentNbQueries === 0) this.emit('searchQueueEmpty');\n\n  var results = content.results.slice();\n\n  states.forEach(function (s) {\n    var state = s.state;\n    var queriesCount = s.queriesCount;\n    var helper = s.helper;\n    var specificResults = results.splice(0, queriesCount);\n\n    if (!state.index) {\n      helper.emit('result', {\n        results: null,\n        state: state,\n      });\n      return;\n    }\n\n    helper.lastResults = new SearchResults(state, specificResults);\n\n    helper.emit('result', {\n      results: helper.lastResults,\n      state: state,\n    });\n  });\n};\n\nAlgoliaSearchHelper.prototype._dispatchAlgoliaError = function (\n  queryId,\n  error\n) {\n  if (queryId < this._lastQueryIdReceived) {\n    // Outdated answer\n    return;\n  }\n\n  this._currentNbQueries -= queryId - this._lastQueryIdReceived;\n  this._lastQueryIdReceived = queryId;\n\n  this.emit('error', {\n    error: error,\n  });\n\n  if (this._currentNbQueries === 0) this.emit('searchQueueEmpty');\n};\n\nAlgoliaSearchHelper.prototype.containsRefinement = function (\n  query,\n  facetFilters,\n  numericFilters,\n  tagFilters\n) {\n  return (\n    query ||\n    facetFilters.length !== 0 ||\n    numericFilters.length !== 0 ||\n    tagFilters.length !== 0\n  );\n};\n\n/**\n * Test if there are some disjunctive refinements on the facet\n * @private\n * @param {string} facet the attribute to test\n * @return {boolean} true if there are refinements on this attribute\n */\nAlgoliaSearchHelper.prototype._hasDisjunctiveRefinements = function (facet) {\n  return (\n    this.state.disjunctiveRefinements[facet] &&\n    this.state.disjunctiveRefinements[facet].length > 0\n  );\n};\n\nAlgoliaSearchHelper.prototype._change = function (event) {\n  var state = event.state;\n  var isPageReset = event.isPageReset;\n\n  if (state !== this.state) {\n    this.state = state;\n\n    this.emit('change', {\n      state: this.state,\n      results: this.lastResults,\n      isPageReset: isPageReset,\n    });\n  }\n};\n\n/**\n * Clears the cache of the underlying Algolia client.\n * @return {AlgoliaSearchHelper} Method is chainable, it returns itself\n */\nAlgoliaSearchHelper.prototype.clearCache = function () {\n  if (this.client.clearCache) this.client.clearCache();\n  return this;\n};\n\n/**\n * Updates the internal client instance. If the reference of the clients\n * are equal then no update is actually done.\n * @param  {AlgoliaSearch} newClient an AlgoliaSearch client\n * @return {AlgoliaSearchHelper} Method is chainable, it returns itself\n */\nAlgoliaSearchHelper.prototype.setClient = function (newClient) {\n  if (this.client === newClient) return this;\n\n  if (typeof newClient.addAlgoliaAgent === 'function') {\n    newClient.addAlgoliaAgent('JS Helper (' + version + ')');\n  }\n  this.client = newClient;\n\n  return this;\n};\n\n/**\n * Gets the instance of the currently used client.\n * @return {AlgoliaSearch} the currently used client\n */\nAlgoliaSearchHelper.prototype.getClient = function () {\n  return this.client;\n};\n\n/**\n * Creates an derived instance of the Helper. A derived helper\n * is a way to request other indices synchronised with the lifecycle\n * of the main Helper. This mechanism uses the multiqueries feature\n * of Algolia to aggregate all the requests in a single network call.\n *\n * This method takes a function that is used to create a new SearchParameter\n * that will be used to create requests to Algolia. Those new requests\n * are created just before the `search` event. The signature of the function\n * is `SearchParameters -> SearchParameters`.\n *\n * This method returns a new DerivedHelper which is an EventEmitter\n * that fires the same `search`, `result` and `error` events. Those\n * events, however, will receive data specific to this DerivedHelper\n * and the SearchParameters that is returned by the call of the\n * parameter function.\n * @param {function} fn SearchParameters -> SearchParameters\n * @return {DerivedHelper} a new DerivedHelper\n */\nAlgoliaSearchHelper.prototype.derive = function (fn) {\n  var derivedHelper = new DerivedHelper(this, fn);\n  this.derivedHelpers.push(derivedHelper);\n  return derivedHelper;\n};\n\n/**\n * This method detaches a derived Helper from the main one. Prefer using the one from the\n * derived helper itself, to remove the event listeners too.\n * @private\n * @param  {DerivedHelper} derivedHelper the derived helper to detach\n * @return {undefined} nothing is returned\n * @throws Error\n */\nAlgoliaSearchHelper.prototype.detachDerivedHelper = function (derivedHelper) {\n  var pos = this.derivedHelpers.indexOf(derivedHelper);\n  if (pos === -1) throw new Error('Derived helper already detached');\n  this.derivedHelpers.splice(pos, 1);\n};\n\n/**\n * This method returns true if there is currently at least one on-going search.\n * @return {boolean} true if there is a search pending\n */\nAlgoliaSearchHelper.prototype.hasPendingRequests = function () {\n  return this._currentNbQueries > 0;\n};\n\n/**\n * @typedef AlgoliaSearchHelper.NumericRefinement\n * @type {object}\n * @property {number[]} value the numbers that are used for filtering this attribute with\n * the operator specified.\n * @property {string} operator the faceting data: value, number of entries\n * @property {string} type will be 'numeric'\n */\n\n/**\n * @typedef AlgoliaSearchHelper.FacetRefinement\n * @type {object}\n * @property {string} value the string use to filter the attribute\n * @property {string} type the type of filter: 'conjunctive', 'disjunctive', 'exclude'\n */\n\nmodule.exports = AlgoliaSearchHelper;\n","'use strict';\n\nmodule.exports = function compact(array) {\n  if (!Array.isArray(array)) {\n    return [];\n  }\n\n  return array.filter(Boolean);\n};\n","'use strict';\n\n// NOTE: this behaves like lodash/defaults, but doesn't mutate the target\n// it also preserve keys order\nmodule.exports = function defaultsPure() {\n  var sources = Array.prototype.slice.call(arguments);\n\n  return sources.reduceRight(function (acc, source) {\n    Object.keys(Object(source)).forEach(function (key) {\n      if (source[key] === undefined) {\n        return;\n      }\n      if (acc[key] !== undefined) {\n        // remove if already added, so that we can add it in correct order\n        delete acc[key];\n      }\n      acc[key] = source[key];\n    });\n    return acc;\n  }, {});\n};\n","'use strict';\n\n/**\n * Replaces a leading - with \\-\n * @private\n * @param {any} value the facet value to replace\n * @returns {any} the escaped facet value or the value if it was not a string\n */\nfunction escapeFacetValue(value) {\n  if (typeof value !== 'string') return value;\n\n  return String(value).replace(/^-/, '\\\\-');\n}\n\n/**\n * Replaces a leading \\- with -\n * @private\n * @param {any} value the escaped facet value\n * @returns {any} the unescaped facet value or the value if it was not a string\n */\nfunction unescapeFacetValue(value) {\n  if (typeof value !== 'string') return value;\n\n  return value.replace(/^\\\\-/, '-');\n}\n\nmodule.exports = {\n  escapeFacetValue: escapeFacetValue,\n  unescapeFacetValue: unescapeFacetValue,\n};\n","'use strict';\n\n// @MAJOR can be replaced by native Array#find when we change support\nmodule.exports = function find(array, comparator) {\n  if (!Array.isArray(array)) {\n    return undefined;\n  }\n\n  for (var i = 0; i < array.length; i++) {\n    if (comparator(array[i])) {\n      return array[i];\n    }\n  }\n\n  return undefined;\n};\n","'use strict';\n\n// @MAJOR can be replaced by native Array#findIndex when we change support\nmodule.exports = function find(array, comparator) {\n  if (!Array.isArray(array)) {\n    return -1;\n  }\n\n  for (var i = 0; i < array.length; i++) {\n    if (comparator(array[i])) {\n      return i;\n    }\n  }\n  return -1;\n};\n","'use strict';\n\nvar find = require('./find');\n\n/**\n * Transform sort format from user friendly notation to lodash format\n * @param {string[]} sortBy array of predicate of the form \"attribute:order\"\n * @param {string[]} [defaults] array of predicate of the form \"attribute:order\"\n * @return {array.<string[]>} array containing 2 elements : attributes, orders\n */\nmodule.exports = function formatSort(sortBy, defaults) {\n  var defaultInstructions = (defaults || []).map(function (sort) {\n    return sort.split(':');\n  });\n\n  return sortBy.reduce(\n    function preparePredicate(out, sort) {\n      var sortInstruction = sort.split(':');\n\n      var matchingDefault = find(\n        defaultInstructions,\n        function (defaultInstruction) {\n          return defaultInstruction[0] === sortInstruction[0];\n        }\n      );\n\n      if (sortInstruction.length > 1 || !matchingDefault) {\n        out[0].push(sortInstruction[0]);\n        out[1].push(sortInstruction[1]);\n        return out;\n      }\n\n      out[0].push(matchingDefault[0]);\n      out[1].push(matchingDefault[1]);\n      return out;\n    },\n    [[], []]\n  );\n};\n","'use strict';\n\nfunction inherits(ctor, superCtor) {\n  ctor.prototype = Object.create(superCtor.prototype, {\n    constructor: {\n      value: ctor,\n      enumerable: false,\n      writable: true,\n      configurable: true,\n    },\n  });\n}\n\nmodule.exports = inherits;\n","'use strict';\n\nfunction intersection(arr1, arr2) {\n  return arr1.filter(function (value, index) {\n    return (\n      arr2.indexOf(value) > -1 &&\n      arr1.indexOf(value) === index /* skips duplicates */\n    );\n  });\n}\n\nmodule.exports = intersection;\n","'use strict';\n\nfunction clone(value) {\n  if (typeof value === 'object' && value !== null) {\n    return _merge(Array.isArray(value) ? [] : {}, value);\n  }\n  return value;\n}\n\nfunction isObjectOrArrayOrFunction(value) {\n  return (\n    typeof value === 'function' ||\n    Array.isArray(value) ||\n    Object.prototype.toString.call(value) === '[object Object]'\n  );\n}\n\nfunction _merge(target, source) {\n  if (target === source) {\n    return target;\n  }\n\n  // eslint-disable-next-line no-restricted-syntax\n  for (var key in source) {\n    if (\n      !Object.prototype.hasOwnProperty.call(source, key) ||\n      key === '__proto__' ||\n      key === 'constructor'\n    ) {\n      // eslint-disable-next-line no-continue\n      continue;\n    }\n\n    var sourceVal = source[key];\n    var targetVal = target[key];\n\n    if (typeof targetVal !== 'undefined' && typeof sourceVal === 'undefined') {\n      // eslint-disable-next-line no-continue\n      continue;\n    }\n\n    if (\n      isObjectOrArrayOrFunction(targetVal) &&\n      isObjectOrArrayOrFunction(sourceVal)\n    ) {\n      target[key] = _merge(targetVal, sourceVal);\n    } else {\n      target[key] = clone(sourceVal);\n    }\n  }\n  return target;\n}\n\n/**\n * This method is like Object.assign, but recursively merges own and inherited\n * enumerable keyed properties of source objects into the destination object.\n *\n * NOTE: this behaves like lodash/merge, but:\n * - does mutate functions if they are a source\n * - treats non-plain objects as plain\n * - does not work for circular objects\n * - treats sparse arrays as sparse\n * - does not convert Array-like objects (Arguments, NodeLists, etc.) to arrays\n *\n * @param {Object} target The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n */\nfunction merge(target) {\n  if (!isObjectOrArrayOrFunction(target)) {\n    target = {};\n  }\n\n  for (var i = 1, l = arguments.length; i < l; i++) {\n    var source = arguments[i];\n\n    if (isObjectOrArrayOrFunction(source)) {\n      _merge(target, source);\n    }\n  }\n  return target;\n}\n\nmodule.exports = merge;\n","'use strict';\n\nfunction objectHasKeys(obj) {\n  return obj && Object.keys(obj).length > 0;\n}\n\nmodule.exports = objectHasKeys;\n","'use strict';\n\n// https://github.com/babel/babel/blob/3aaafae053fa75febb3aa45d45b6f00646e30ba4/packages/babel-helpers/src/helpers.js#L604-L620\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n  if (source === null) return {};\n  var target = {};\n  var sourceKeys = Object.keys(source);\n  var key;\n  var i;\n  for (i = 0; i < sourceKeys.length; i++) {\n    key = sourceKeys[i];\n    // eslint-disable-next-line no-continue\n    if (excluded.indexOf(key) >= 0) continue;\n    target[key] = source[key];\n  }\n  return target;\n}\n\nmodule.exports = _objectWithoutPropertiesLoose;\n","'use strict';\n\nfunction compareAscending(value, other) {\n  if (value !== other) {\n    var valIsDefined = value !== undefined;\n    var valIsNull = value === null;\n\n    var othIsDefined = other !== undefined;\n    var othIsNull = other === null;\n\n    if (\n      (!othIsNull && value > other) ||\n      (valIsNull && othIsDefined) ||\n      !valIsDefined\n    ) {\n      return 1;\n    }\n    if (\n      (!valIsNull && value < other) ||\n      (othIsNull && valIsDefined) ||\n      !othIsDefined\n    ) {\n      return -1;\n    }\n  }\n  return 0;\n}\n\n/**\n * @param {Array<object>} collection object with keys in attributes\n * @param {Array<string>} iteratees attributes\n * @param {Array<string>} orders asc | desc\n * @return {Array<object>} sorted collection\n */\nfunction orderBy(collection, iteratees, orders) {\n  if (!Array.isArray(collection)) {\n    return [];\n  }\n\n  if (!Array.isArray(orders)) {\n    orders = [];\n  }\n\n  var result = collection.map(function (value, index) {\n    return {\n      criteria: iteratees.map(function (iteratee) {\n        return value[iteratee];\n      }),\n      index: index,\n      value: value,\n    };\n  });\n\n  result.sort(function comparer(object, other) {\n    var index = -1;\n\n    while (++index < object.criteria.length) {\n      var res = compareAscending(object.criteria[index], other.criteria[index]);\n      if (res) {\n        if (index >= orders.length) {\n          return res;\n        }\n        if (orders[index] === 'desc') {\n          return -res;\n        }\n        return res;\n      }\n    }\n\n    // This ensures a stable sort in V8 and other engines.\n    // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.\n    return object.index - other.index;\n  });\n\n  return result.map(function (res) {\n    return res.value;\n  });\n}\n\nmodule.exports = orderBy;\n","'use strict';\n\nfunction valToNumber(v) {\n  if (typeof v === 'number') {\n    return v;\n  } else if (typeof v === 'string') {\n    return parseFloat(v);\n  } else if (Array.isArray(v)) {\n    return v.map(valToNumber);\n  }\n\n  throw new Error(\n    'The value should be a number, a parsable string or an array of those.'\n  );\n}\n\nmodule.exports = valToNumber;\n","'use strict';\n\nvar merge = require('./functions/merge');\n\nfunction sortObject(obj) {\n  return Object.keys(obj)\n    .sort()\n    .reduce(function (acc, curr) {\n      acc[curr] = obj[curr];\n      return acc;\n    }, {});\n}\n\nvar requestBuilder = {\n  /**\n   * Get all the queries to send to the client, those queries can used directly\n   * with the Algolia client.\n   * @private\n   * @param  {string} index The name of the index\n   * @param  {SearchParameters} state The state from which to get the queries\n   * @return {object[]} The queries\n   */\n  _getQueries: function getQueries(index, state) {\n    var queries = [];\n\n    // One query for the hits\n    queries.push({\n      indexName: index,\n      params: requestBuilder._getHitsSearchParams(state),\n    });\n\n    // One for each disjunctive facets\n    state.getRefinedDisjunctiveFacets().forEach(function (refinedFacet) {\n      queries.push({\n        indexName: index,\n        params: requestBuilder._getDisjunctiveFacetSearchParams(\n          state,\n          refinedFacet\n        ),\n      });\n    });\n\n    // More to get the parent levels of the hierarchical facets when refined\n    state.getRefinedHierarchicalFacets().forEach(function (refinedFacet) {\n      var hierarchicalFacet = state.getHierarchicalFacetByName(refinedFacet);\n      var currentRefinement = state.getHierarchicalRefinement(refinedFacet);\n      var separator = state._getHierarchicalFacetSeparator(hierarchicalFacet);\n\n      // If we are deeper than level 0 (starting from `beer > IPA`)\n      // we want to get all parent values\n      if (\n        currentRefinement.length > 0 &&\n        currentRefinement[0].split(separator).length > 1\n      ) {\n        // We generate a map of the filters we will use for our facet values queries\n        var filtersMap = currentRefinement[0]\n          .split(separator)\n          .slice(0, -1)\n          .reduce(function createFiltersMap(map, segment, level) {\n            return map.concat({\n              attribute: hierarchicalFacet.attributes[level],\n              value:\n                level === 0\n                  ? segment\n                  : [map[map.length - 1].value, segment].join(separator),\n            });\n          }, []);\n\n        filtersMap.forEach(function (filter, level) {\n          var params = requestBuilder._getDisjunctiveFacetSearchParams(\n            state,\n            filter.attribute,\n            level === 0\n          );\n\n          // Keep facet filters unrelated to current hierarchical attributes\n          function hasHierarchicalFacetFilter(value) {\n            return hierarchicalFacet.attributes.some(function (attribute) {\n              return attribute === value.split(':')[0];\n            });\n          }\n\n          var filteredFacetFilters = (params.facetFilters || []).reduce(\n            function (acc, facetFilter) {\n              if (Array.isArray(facetFilter)) {\n                var filtered = facetFilter.filter(function (filterValue) {\n                  return !hasHierarchicalFacetFilter(filterValue);\n                });\n\n                if (filtered.length > 0) {\n                  acc.push(filtered);\n                }\n              }\n\n              if (\n                typeof facetFilter === 'string' &&\n                !hasHierarchicalFacetFilter(facetFilter)\n              ) {\n                acc.push(facetFilter);\n              }\n\n              return acc;\n            },\n            []\n          );\n\n          var parent = filtersMap[level - 1];\n          if (level > 0) {\n            params.facetFilters = filteredFacetFilters.concat(\n              parent.attribute + ':' + parent.value\n            );\n          } else {\n            params.facetFilters =\n              filteredFacetFilters.length > 0\n                ? filteredFacetFilters\n                : undefined;\n          }\n\n          queries.push({ indexName: index, params: params });\n        });\n      }\n    });\n\n    return queries;\n  },\n\n  /**\n   * Build search parameters used to fetch hits\n   * @private\n   * @param  {SearchParameters} state The state from which to get the queries\n   * @return {object.<string, any>} The search parameters for hits\n   */\n  _getHitsSearchParams: function (state) {\n    var facets = state.facets\n      .concat(state.disjunctiveFacets)\n      .concat(requestBuilder._getHitsHierarchicalFacetsAttributes(state))\n      .sort();\n\n    var facetFilters = requestBuilder._getFacetFilters(state);\n    var numericFilters = requestBuilder._getNumericFilters(state);\n    var tagFilters = requestBuilder._getTagFilters(state);\n    var additionalParams = {\n      facets: facets.indexOf('*') > -1 ? ['*'] : facets,\n      tagFilters: tagFilters,\n    };\n\n    if (facetFilters.length > 0) {\n      additionalParams.facetFilters = facetFilters;\n    }\n\n    if (numericFilters.length > 0) {\n      additionalParams.numericFilters = numericFilters;\n    }\n\n    return sortObject(merge({}, state.getQueryParams(), additionalParams));\n  },\n\n  /**\n   * Build search parameters used to fetch a disjunctive facet\n   * @private\n   * @param  {SearchParameters} state The state from which to get the queries\n   * @param  {string} facet the associated facet name\n   * @param  {boolean} hierarchicalRootLevel ?? FIXME\n   * @return {object} The search parameters for a disjunctive facet\n   */\n  _getDisjunctiveFacetSearchParams: function (\n    state,\n    facet,\n    hierarchicalRootLevel\n  ) {\n    var facetFilters = requestBuilder._getFacetFilters(\n      state,\n      facet,\n      hierarchicalRootLevel\n    );\n    var numericFilters = requestBuilder._getNumericFilters(state, facet);\n    var tagFilters = requestBuilder._getTagFilters(state);\n    var additionalParams = {\n      hitsPerPage: 0,\n      page: 0,\n      analytics: false,\n      clickAnalytics: false,\n    };\n\n    if (tagFilters.length > 0) {\n      additionalParams.tagFilters = tagFilters;\n    }\n\n    var hierarchicalFacet = state.getHierarchicalFacetByName(facet);\n\n    if (hierarchicalFacet) {\n      additionalParams.facets =\n        requestBuilder._getDisjunctiveHierarchicalFacetAttribute(\n          state,\n          hierarchicalFacet,\n          hierarchicalRootLevel\n        );\n    } else {\n      additionalParams.facets = facet;\n    }\n\n    if (numericFilters.length > 0) {\n      additionalParams.numericFilters = numericFilters;\n    }\n\n    if (facetFilters.length > 0) {\n      additionalParams.facetFilters = facetFilters;\n    }\n\n    return sortObject(merge({}, state.getQueryParams(), additionalParams));\n  },\n\n  /**\n   * Return the numeric filters in an algolia request fashion\n   * @private\n   * @param {SearchParameters} state the state from which to get the filters\n   * @param {string} [facetName] the name of the attribute for which the filters should be excluded\n   * @return {string[]} the numeric filters in the algolia format\n   */\n  _getNumericFilters: function (state, facetName) {\n    if (state.numericFilters) {\n      return state.numericFilters;\n    }\n\n    var numericFilters = [];\n\n    Object.keys(state.numericRefinements).forEach(function (attribute) {\n      var operators = state.numericRefinements[attribute] || {};\n      Object.keys(operators).forEach(function (operator) {\n        var values = operators[operator] || [];\n        if (facetName !== attribute) {\n          values.forEach(function (value) {\n            if (Array.isArray(value)) {\n              var vs = value.map(function (v) {\n                return attribute + operator + v;\n              });\n              numericFilters.push(vs);\n            } else {\n              numericFilters.push(attribute + operator + value);\n            }\n          });\n        }\n      });\n    });\n\n    return numericFilters;\n  },\n\n  /**\n   * Return the tags filters depending on which format is used, either tagFilters or tagRefinements\n   * @private\n   * @param {SearchParameters} state the state from which to get the filters\n   * @return {string} Tag filters in a single string\n   */\n  _getTagFilters: function (state) {\n    if (state.tagFilters) {\n      return state.tagFilters;\n    }\n\n    return state.tagRefinements.join(',');\n  },\n\n  /**\n   * Build facetFilters parameter based on current refinements. The array returned\n   * contains strings representing the facet filters in the algolia format.\n   * @private\n   * @param  {SearchParameters} state The state from which to get the queries\n   * @param  {string} [facet] if set, the current disjunctive facet\n   * @param  {boolean} [hierarchicalRootLevel] ?? FIXME\n   * @return {array.<string>} The facet filters in the algolia format\n   */\n  _getFacetFilters: function (state, facet, hierarchicalRootLevel) {\n    var facetFilters = [];\n\n    var facetsRefinements = state.facetsRefinements || {};\n    Object.keys(facetsRefinements)\n      .sort()\n      .forEach(function (facetName) {\n        var facetValues = facetsRefinements[facetName] || [];\n        facetValues.sort().forEach(function (facetValue) {\n          facetFilters.push(facetName + ':' + facetValue);\n        });\n      });\n\n    var facetsExcludes = state.facetsExcludes || {};\n    Object.keys(facetsExcludes)\n      .sort()\n      .forEach(function (facetName) {\n        var facetValues = facetsExcludes[facetName] || [];\n        facetValues.sort().forEach(function (facetValue) {\n          facetFilters.push(facetName + ':-' + facetValue);\n        });\n      });\n\n    var disjunctiveFacetsRefinements = state.disjunctiveFacetsRefinements || {};\n    Object.keys(disjunctiveFacetsRefinements)\n      .sort()\n      .forEach(function (facetName) {\n        var facetValues = disjunctiveFacetsRefinements[facetName] || [];\n        if (facetName === facet || !facetValues || facetValues.length === 0) {\n          return;\n        }\n        var orFilters = [];\n\n        facetValues.sort().forEach(function (facetValue) {\n          orFilters.push(facetName + ':' + facetValue);\n        });\n\n        facetFilters.push(orFilters);\n      });\n\n    var hierarchicalFacetsRefinements =\n      state.hierarchicalFacetsRefinements || {};\n    Object.keys(hierarchicalFacetsRefinements)\n      .sort()\n      .forEach(function (facetName) {\n        var facetValues = hierarchicalFacetsRefinements[facetName] || [];\n        var facetValue = facetValues[0];\n\n        if (facetValue === undefined) {\n          return;\n        }\n\n        var hierarchicalFacet = state.getHierarchicalFacetByName(facetName);\n        var separator = state._getHierarchicalFacetSeparator(hierarchicalFacet);\n        var rootPath = state._getHierarchicalRootPath(hierarchicalFacet);\n        var attributeToRefine;\n        var attributesIndex;\n\n        // we ask for parent facet values only when the `facet` is the current hierarchical facet\n        if (facet === facetName) {\n          // if we are at the root level already, no need to ask for facet values, we get them from\n          // the hits query\n          if (\n            facetValue.indexOf(separator) === -1 ||\n            (!rootPath && hierarchicalRootLevel === true) ||\n            (rootPath &&\n              rootPath.split(separator).length ===\n                facetValue.split(separator).length)\n          ) {\n            return;\n          }\n\n          if (!rootPath) {\n            attributesIndex = facetValue.split(separator).length - 2;\n            facetValue = facetValue.slice(0, facetValue.lastIndexOf(separator));\n          } else {\n            attributesIndex = rootPath.split(separator).length - 1;\n            facetValue = rootPath;\n          }\n\n          attributeToRefine = hierarchicalFacet.attributes[attributesIndex];\n        } else {\n          attributesIndex = facetValue.split(separator).length - 1;\n\n          attributeToRefine = hierarchicalFacet.attributes[attributesIndex];\n        }\n\n        if (attributeToRefine) {\n          facetFilters.push([attributeToRefine + ':' + facetValue]);\n        }\n      });\n\n    return facetFilters;\n  },\n\n  _getHitsHierarchicalFacetsAttributes: function (state) {\n    var out = [];\n\n    return state.hierarchicalFacets.reduce(\n      // ask for as much levels as there's hierarchical refinements\n      function getHitsAttributesForHierarchicalFacet(\n        allAttributes,\n        hierarchicalFacet\n      ) {\n        var hierarchicalRefinement = state.getHierarchicalRefinement(\n          hierarchicalFacet.name\n        )[0];\n\n        // if no refinement, ask for root level\n        if (!hierarchicalRefinement) {\n          allAttributes.push(hierarchicalFacet.attributes[0]);\n          return allAttributes;\n        }\n\n        var separator = state._getHierarchicalFacetSeparator(hierarchicalFacet);\n        var level = hierarchicalRefinement.split(separator).length;\n        var newAttributes = hierarchicalFacet.attributes.slice(0, level + 1);\n\n        return allAttributes.concat(newAttributes);\n      },\n      out\n    );\n  },\n\n  _getDisjunctiveHierarchicalFacetAttribute: function (\n    state,\n    hierarchicalFacet,\n    rootLevel\n  ) {\n    var separator = state._getHierarchicalFacetSeparator(hierarchicalFacet);\n    if (rootLevel === true) {\n      var rootPath = state._getHierarchicalRootPath(hierarchicalFacet);\n      var attributeIndex = 0;\n\n      if (rootPath) {\n        attributeIndex = rootPath.split(separator).length;\n      }\n      return [hierarchicalFacet.attributes[attributeIndex]];\n    }\n\n    var hierarchicalRefinement =\n      state.getHierarchicalRefinement(hierarchicalFacet.name)[0] || '';\n    // if refinement is 'beers > IPA > Flying dog',\n    // then we want `facets: ['beers > IPA']` as disjunctive facet (parent level values)\n\n    var parentLevel = hierarchicalRefinement.split(separator).length - 1;\n    return hierarchicalFacet.attributes.slice(0, parentLevel + 1);\n  },\n\n  getSearchForFacetQuery: function (facetName, query, maxFacetHits, state) {\n    var stateForSearchForFacetValues = state.isDisjunctiveFacet(facetName)\n      ? state.clearRefinements(facetName)\n      : state;\n    var searchForFacetSearchParameters = {\n      facetQuery: query,\n      facetName: facetName,\n    };\n    if (typeof maxFacetHits === 'number') {\n      searchForFacetSearchParameters.maxFacetHits = maxFacetHits;\n    }\n    return sortObject(\n      merge(\n        {},\n        requestBuilder._getHitsSearchParams(stateForSearchForFacetValues),\n        searchForFacetSearchParameters\n      )\n    );\n  },\n};\n\nmodule.exports = requestBuilder;\n","'use strict';\n\nmodule.exports = function isValidUserToken(userToken) {\n  if (userToken === null) {\n    return false;\n  }\n  return /^[a-zA-Z0-9_-]{1,64}$/.test(userToken);\n};\n","'use strict';\n\nmodule.exports = '3.14.2';\n","/**\n * @license React\n * use-sync-external-store-shim.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var e=require(\"react\");function h(a,b){return a===b&&(0!==a||1/a===1/b)||a!==a&&b!==b}var k=\"function\"===typeof Object.is?Object.is:h,l=e.useState,m=e.useEffect,n=e.useLayoutEffect,p=e.useDebugValue;function q(a,b){var d=b(),f=l({inst:{value:d,getSnapshot:b}}),c=f[0].inst,g=f[1];n(function(){c.value=d;c.getSnapshot=b;r(c)&&g({inst:c})},[a,d,b]);m(function(){r(c)&&g({inst:c});return a(function(){r(c)&&g({inst:c})})},[a]);p(d);return d}\nfunction r(a){var b=a.getSnapshot;a=a.value;try{var d=b();return!k(a,d)}catch(f){return!0}}function t(a,b){return b()}var u=\"undefined\"===typeof window||\"undefined\"===typeof window.document||\"undefined\"===typeof window.document.createElement?t:q;exports.useSyncExternalStore=void 0!==e.useSyncExternalStore?e.useSyncExternalStore:u;\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports = require('../cjs/use-sync-external-store-shim.production.min.js');\n} else {\n  module.exports = require('../cjs/use-sync-external-store-shim.development.js');\n}\n","function memo(getDeps, fn, opts) {\n  let deps = opts.initialDeps ?? [];\n  let result;\n  return () => {\n    var _a, _b, _c, _d;\n    let depTime;\n    if (opts.key && ((_a = opts.debug) == null ? void 0 : _a.call(opts)))\n      depTime = Date.now();\n    const newDeps = getDeps();\n    const depsChanged = newDeps.length !== deps.length || newDeps.some((dep, index) => deps[index] !== dep);\n    if (!depsChanged) {\n      return result;\n    }\n    deps = newDeps;\n    let resultTime;\n    if (opts.key && ((_b = opts.debug) == null ? void 0 : _b.call(opts)))\n      resultTime = Date.now();\n    result = fn(...newDeps);\n    if (opts.key && ((_c = opts.debug) == null ? void 0 : _c.call(opts))) {\n      const depEndTime = Math.round((Date.now() - depTime) * 100) / 100;\n      const resultEndTime = Math.round((Date.now() - resultTime) * 100) / 100;\n      const resultFpsPercentage = resultEndTime / 16;\n      const pad = (str, num) => {\n        str = String(str);\n        while (str.length < num) {\n          str = \" \" + str;\n        }\n        return str;\n      };\n      console.info(\n        `%c⏱ ${pad(resultEndTime, 5)} /${pad(depEndTime, 5)} ms`,\n        `\n            font-size: .6rem;\n            font-weight: bold;\n            color: hsl(${Math.max(\n          0,\n          Math.min(120 - 120 * resultFpsPercentage, 120)\n        )}deg 100% 31%);`,\n        opts == null ? void 0 : opts.key\n      );\n    }\n    (_d = opts == null ? void 0 : opts.onChange) == null ? void 0 : _d.call(opts, result);\n    return result;\n  };\n}\nfunction notUndefined(value, msg) {\n  if (value === void 0) {\n    throw new Error(`Unexpected undefined${msg ? `: ${msg}` : \"\"}`);\n  } else {\n    return value;\n  }\n}\nconst approxEqual = (a, b) => Math.abs(a - b) < 1;\nconst debounce = (fn, ms) => {\n  let timeoutId;\n  return function(...args) {\n    clearTimeout(timeoutId);\n    timeoutId = setTimeout(() => fn.apply(this, args), ms);\n  };\n};\nexport {\n  approxEqual,\n  debounce,\n  memo,\n  notUndefined\n};\n//# sourceMappingURL=utils.js.map\n","import { debounce, memo, notUndefined, approxEqual } from \"./utils.js\";\nconst defaultKeyExtractor = (index) => index;\nconst defaultRangeExtractor = (range) => {\n  const start = Math.max(range.startIndex - range.overscan, 0);\n  const end = Math.min(range.endIndex + range.overscan, range.count - 1);\n  const arr = [];\n  for (let i = start; i <= end; i++) {\n    arr.push(i);\n  }\n  return arr;\n};\nconst observeElementRect = (instance, cb) => {\n  const element = instance.scrollElement;\n  if (!element) {\n    return;\n  }\n  const handler = (rect) => {\n    const { width, height } = rect;\n    cb({ width: Math.round(width), height: Math.round(height) });\n  };\n  handler(element.getBoundingClientRect());\n  if (typeof ResizeObserver === \"undefined\") {\n    return () => {\n    };\n  }\n  const observer = new ResizeObserver((entries) => {\n    const entry = entries[0];\n    if (entry == null ? void 0 : entry.borderBoxSize) {\n      const box = entry.borderBoxSize[0];\n      if (box) {\n        handler({ width: box.inlineSize, height: box.blockSize });\n        return;\n      }\n    }\n    handler(element.getBoundingClientRect());\n  });\n  observer.observe(element, { box: \"border-box\" });\n  return () => {\n    observer.unobserve(element);\n  };\n};\nconst addEventListenerOptions = {\n  passive: true\n};\nconst observeWindowRect = (instance, cb) => {\n  const element = instance.scrollElement;\n  if (!element) {\n    return;\n  }\n  const handler = () => {\n    cb({ width: element.innerWidth, height: element.innerHeight });\n  };\n  handler();\n  element.addEventListener(\"resize\", handler, addEventListenerOptions);\n  return () => {\n    element.removeEventListener(\"resize\", handler);\n  };\n};\nconst supportsScrollend = typeof window == \"undefined\" ? true : \"onscrollend\" in window;\nconst observeElementOffset = (instance, cb) => {\n  const element = instance.scrollElement;\n  if (!element) {\n    return;\n  }\n  let offset = 0;\n  const fallback = supportsScrollend ? () => void 0 : debounce(() => {\n    cb(offset, false);\n  }, instance.options.isScrollingResetDelay);\n  const createHandler = (isScrolling) => () => {\n    offset = element[instance.options.horizontal ? \"scrollLeft\" : \"scrollTop\"];\n    fallback();\n    cb(offset, isScrolling);\n  };\n  const handler = createHandler(true);\n  const endHandler = createHandler(false);\n  endHandler();\n  element.addEventListener(\"scroll\", handler, addEventListenerOptions);\n  element.addEventListener(\"scrollend\", endHandler, addEventListenerOptions);\n  return () => {\n    element.removeEventListener(\"scroll\", handler);\n    element.removeEventListener(\"scrollend\", endHandler);\n  };\n};\nconst observeWindowOffset = (instance, cb) => {\n  const element = instance.scrollElement;\n  if (!element) {\n    return;\n  }\n  let offset = 0;\n  const fallback = supportsScrollend ? () => void 0 : debounce(() => {\n    cb(offset, false);\n  }, instance.options.isScrollingResetDelay);\n  const createHandler = (isScrolling) => () => {\n    offset = element[instance.options.horizontal ? \"scrollX\" : \"scrollY\"];\n    fallback();\n    cb(offset, isScrolling);\n  };\n  const handler = createHandler(true);\n  const endHandler = createHandler(false);\n  endHandler();\n  element.addEventListener(\"scroll\", handler, addEventListenerOptions);\n  element.addEventListener(\"scrollend\", endHandler, addEventListenerOptions);\n  return () => {\n    element.removeEventListener(\"scroll\", handler);\n    element.removeEventListener(\"scrollend\", endHandler);\n  };\n};\nconst measureElement = (element, entry, instance) => {\n  if (entry == null ? void 0 : entry.borderBoxSize) {\n    const box = entry.borderBoxSize[0];\n    if (box) {\n      const size = Math.round(\n        box[instance.options.horizontal ? \"inlineSize\" : \"blockSize\"]\n      );\n      return size;\n    }\n  }\n  return Math.round(\n    element.getBoundingClientRect()[instance.options.horizontal ? \"width\" : \"height\"]\n  );\n};\nconst windowScroll = (offset, {\n  adjustments = 0,\n  behavior\n}, instance) => {\n  var _a, _b;\n  const toOffset = offset + adjustments;\n  (_b = (_a = instance.scrollElement) == null ? void 0 : _a.scrollTo) == null ? void 0 : _b.call(_a, {\n    [instance.options.horizontal ? \"left\" : \"top\"]: toOffset,\n    behavior\n  });\n};\nconst elementScroll = (offset, {\n  adjustments = 0,\n  behavior\n}, instance) => {\n  var _a, _b;\n  const toOffset = offset + adjustments;\n  (_b = (_a = instance.scrollElement) == null ? void 0 : _a.scrollTo) == null ? void 0 : _b.call(_a, {\n    [instance.options.horizontal ? \"left\" : \"top\"]: toOffset,\n    behavior\n  });\n};\nclass Virtualizer {\n  constructor(opts) {\n    this.unsubs = [];\n    this.scrollElement = null;\n    this.isScrolling = false;\n    this.scrollToIndexTimeoutId = null;\n    this.measurementsCache = [];\n    this.itemSizeCache = /* @__PURE__ */ new Map();\n    this.pendingMeasuredCacheIndexes = [];\n    this.scrollDirection = null;\n    this.scrollAdjustments = 0;\n    this.measureElementCache = /* @__PURE__ */ new Map();\n    this.observer = /* @__PURE__ */ (() => {\n      let _ro = null;\n      const get = () => {\n        if (_ro) {\n          return _ro;\n        } else if (typeof ResizeObserver !== \"undefined\") {\n          return _ro = new ResizeObserver((entries) => {\n            entries.forEach((entry) => {\n              this._measureElement(entry.target, entry);\n            });\n          });\n        } else {\n          return null;\n        }\n      };\n      return {\n        disconnect: () => {\n          var _a;\n          return (_a = get()) == null ? void 0 : _a.disconnect();\n        },\n        observe: (target) => {\n          var _a;\n          return (_a = get()) == null ? void 0 : _a.observe(target, { box: \"border-box\" });\n        },\n        unobserve: (target) => {\n          var _a;\n          return (_a = get()) == null ? void 0 : _a.unobserve(target);\n        }\n      };\n    })();\n    this.range = null;\n    this.setOptions = (opts2) => {\n      Object.entries(opts2).forEach(([key, value]) => {\n        if (typeof value === \"undefined\")\n          delete opts2[key];\n      });\n      this.options = {\n        debug: false,\n        initialOffset: 0,\n        overscan: 1,\n        paddingStart: 0,\n        paddingEnd: 0,\n        scrollPaddingStart: 0,\n        scrollPaddingEnd: 0,\n        horizontal: false,\n        getItemKey: defaultKeyExtractor,\n        rangeExtractor: defaultRangeExtractor,\n        onChange: () => {\n        },\n        measureElement,\n        initialRect: { width: 0, height: 0 },\n        scrollMargin: 0,\n        gap: 0,\n        indexAttribute: \"data-index\",\n        initialMeasurementsCache: [],\n        lanes: 1,\n        isScrollingResetDelay: 150,\n        ...opts2\n      };\n    };\n    this.notify = (force, sync) => {\n      var _a, _b;\n      const { startIndex, endIndex } = this.range ?? {\n        startIndex: void 0,\n        endIndex: void 0\n      };\n      const range = this.calculateRange();\n      if (force || startIndex !== (range == null ? void 0 : range.startIndex) || endIndex !== (range == null ? void 0 : range.endIndex)) {\n        (_b = (_a = this.options).onChange) == null ? void 0 : _b.call(_a, this, sync);\n      }\n    };\n    this.cleanup = () => {\n      this.unsubs.filter(Boolean).forEach((d) => d());\n      this.unsubs = [];\n      this.scrollElement = null;\n    };\n    this._didMount = () => {\n      this.measureElementCache.forEach(this.observer.observe);\n      return () => {\n        this.observer.disconnect();\n        this.cleanup();\n      };\n    };\n    this._willUpdate = () => {\n      const scrollElement = this.options.getScrollElement();\n      if (this.scrollElement !== scrollElement) {\n        this.cleanup();\n        this.scrollElement = scrollElement;\n        this._scrollToOffset(this.scrollOffset, {\n          adjustments: void 0,\n          behavior: void 0\n        });\n        this.unsubs.push(\n          this.options.observeElementRect(this, (rect) => {\n            this.scrollRect = rect;\n            this.notify(false, false);\n          })\n        );\n        this.unsubs.push(\n          this.options.observeElementOffset(this, (offset, isScrolling) => {\n            this.scrollAdjustments = 0;\n            this.scrollDirection = isScrolling ? this.scrollOffset < offset ? \"forward\" : \"backward\" : null;\n            this.scrollOffset = offset;\n            const prevIsScrolling = this.isScrolling;\n            this.isScrolling = isScrolling;\n            this.notify(prevIsScrolling !== isScrolling, isScrolling);\n          })\n        );\n      }\n    };\n    this.getSize = () => {\n      return this.scrollRect[this.options.horizontal ? \"width\" : \"height\"];\n    };\n    this.getMeasurementOptions = memo(\n      () => [\n        this.options.count,\n        this.options.paddingStart,\n        this.options.scrollMargin,\n        this.options.getItemKey\n      ],\n      (count, paddingStart, scrollMargin, getItemKey) => {\n        this.pendingMeasuredCacheIndexes = [];\n        return {\n          count,\n          paddingStart,\n          scrollMargin,\n          getItemKey\n        };\n      },\n      {\n        key: false\n      }\n    );\n    this.getFurthestMeasurement = (measurements, index) => {\n      const furthestMeasurementsFound = /* @__PURE__ */ new Map();\n      const furthestMeasurements = /* @__PURE__ */ new Map();\n      for (let m = index - 1; m >= 0; m--) {\n        const measurement = measurements[m];\n        if (furthestMeasurementsFound.has(measurement.lane)) {\n          continue;\n        }\n        const previousFurthestMeasurement = furthestMeasurements.get(\n          measurement.lane\n        );\n        if (previousFurthestMeasurement == null || measurement.end > previousFurthestMeasurement.end) {\n          furthestMeasurements.set(measurement.lane, measurement);\n        } else if (measurement.end < previousFurthestMeasurement.end) {\n          furthestMeasurementsFound.set(measurement.lane, true);\n        }\n        if (furthestMeasurementsFound.size === this.options.lanes) {\n          break;\n        }\n      }\n      return furthestMeasurements.size === this.options.lanes ? Array.from(furthestMeasurements.values()).sort((a, b) => {\n        if (a.end === b.end) {\n          return a.index - b.index;\n        }\n        return a.end - b.end;\n      })[0] : void 0;\n    };\n    this.getMeasurements = memo(\n      () => [this.getMeasurementOptions(), this.itemSizeCache],\n      ({ count, paddingStart, scrollMargin, getItemKey }, itemSizeCache) => {\n        const min = this.pendingMeasuredCacheIndexes.length > 0 ? Math.min(...this.pendingMeasuredCacheIndexes) : 0;\n        this.pendingMeasuredCacheIndexes = [];\n        const measurements = this.measurementsCache.slice(0, min);\n        for (let i = min; i < count; i++) {\n          const key = getItemKey(i);\n          const furthestMeasurement = this.options.lanes === 1 ? measurements[i - 1] : this.getFurthestMeasurement(measurements, i);\n          const start = furthestMeasurement ? furthestMeasurement.end + this.options.gap : paddingStart + scrollMargin;\n          const measuredSize = itemSizeCache.get(key);\n          const size = typeof measuredSize === \"number\" ? measuredSize : this.options.estimateSize(i);\n          const end = start + size;\n          const lane = furthestMeasurement ? furthestMeasurement.lane : i % this.options.lanes;\n          measurements[i] = {\n            index: i,\n            start,\n            size,\n            end,\n            key,\n            lane\n          };\n        }\n        this.measurementsCache = measurements;\n        return measurements;\n      },\n      {\n        key: process.env.NODE_ENV !== \"production\" && \"getMeasurements\",\n        debug: () => this.options.debug\n      }\n    );\n    this.calculateRange = memo(\n      () => [this.getMeasurements(), this.getSize(), this.scrollOffset],\n      (measurements, outerSize, scrollOffset) => {\n        return this.range = measurements.length > 0 && outerSize > 0 ? calculateRange({\n          measurements,\n          outerSize,\n          scrollOffset\n        }) : null;\n      },\n      {\n        key: process.env.NODE_ENV !== \"production\" && \"calculateRange\",\n        debug: () => this.options.debug\n      }\n    );\n    this.getIndexes = memo(\n      () => [\n        this.options.rangeExtractor,\n        this.calculateRange(),\n        this.options.overscan,\n        this.options.count\n      ],\n      (rangeExtractor, range, overscan, count) => {\n        return range === null ? [] : rangeExtractor({\n          startIndex: range.startIndex,\n          endIndex: range.endIndex,\n          overscan,\n          count\n        });\n      },\n      {\n        key: process.env.NODE_ENV !== \"production\" && \"getIndexes\",\n        debug: () => this.options.debug\n      }\n    );\n    this.indexFromElement = (node) => {\n      const attributeName = this.options.indexAttribute;\n      const indexStr = node.getAttribute(attributeName);\n      if (!indexStr) {\n        console.warn(\n          `Missing attribute name '${attributeName}={index}' on measured element.`\n        );\n        return -1;\n      }\n      return parseInt(indexStr, 10);\n    };\n    this._measureElement = (node, entry) => {\n      const item = this.measurementsCache[this.indexFromElement(node)];\n      if (!item || !node.isConnected) {\n        this.measureElementCache.forEach((cached, key) => {\n          if (cached === node) {\n            this.observer.unobserve(node);\n            this.measureElementCache.delete(key);\n          }\n        });\n        return;\n      }\n      const prevNode = this.measureElementCache.get(item.key);\n      if (prevNode !== node) {\n        if (prevNode) {\n          this.observer.unobserve(prevNode);\n        }\n        this.observer.observe(node);\n        this.measureElementCache.set(item.key, node);\n      }\n      const measuredItemSize = this.options.measureElement(node, entry, this);\n      this.resizeItem(item, measuredItemSize);\n    };\n    this.resizeItem = (item, size) => {\n      const itemSize = this.itemSizeCache.get(item.key) ?? item.size;\n      const delta = size - itemSize;\n      if (delta !== 0) {\n        if (this.shouldAdjustScrollPositionOnItemSizeChange !== void 0 ? this.shouldAdjustScrollPositionOnItemSizeChange(item, delta, this) : item.start < this.scrollOffset + this.scrollAdjustments) {\n          if (process.env.NODE_ENV !== \"production\" && this.options.debug) {\n            console.info(\"correction\", delta);\n          }\n          this._scrollToOffset(this.scrollOffset, {\n            adjustments: this.scrollAdjustments += delta,\n            behavior: void 0\n          });\n        }\n        this.pendingMeasuredCacheIndexes.push(item.index);\n        this.itemSizeCache = new Map(this.itemSizeCache.set(item.key, size));\n        this.notify(true, false);\n      }\n    };\n    this.measureElement = (node) => {\n      if (!node) {\n        return;\n      }\n      this._measureElement(node, void 0);\n    };\n    this.getVirtualItems = memo(\n      () => [this.getIndexes(), this.getMeasurements()],\n      (indexes, measurements) => {\n        const virtualItems = [];\n        for (let k = 0, len = indexes.length; k < len; k++) {\n          const i = indexes[k];\n          const measurement = measurements[i];\n          virtualItems.push(measurement);\n        }\n        return virtualItems;\n      },\n      {\n        key: process.env.NODE_ENV !== \"production\" && \"getIndexes\",\n        debug: () => this.options.debug\n      }\n    );\n    this.getVirtualItemForOffset = (offset) => {\n      const measurements = this.getMeasurements();\n      return notUndefined(\n        measurements[findNearestBinarySearch(\n          0,\n          measurements.length - 1,\n          (index) => notUndefined(measurements[index]).start,\n          offset\n        )]\n      );\n    };\n    this.getOffsetForAlignment = (toOffset, align) => {\n      const size = this.getSize();\n      if (align === \"auto\") {\n        if (toOffset <= this.scrollOffset) {\n          align = \"start\";\n        } else if (toOffset >= this.scrollOffset + size) {\n          align = \"end\";\n        } else {\n          align = \"start\";\n        }\n      }\n      if (align === \"start\") {\n        toOffset = toOffset;\n      } else if (align === \"end\") {\n        toOffset = toOffset - size;\n      } else if (align === \"center\") {\n        toOffset = toOffset - size / 2;\n      }\n      const scrollSizeProp = this.options.horizontal ? \"scrollWidth\" : \"scrollHeight\";\n      const scrollSize = this.scrollElement ? \"document\" in this.scrollElement ? this.scrollElement.document.documentElement[scrollSizeProp] : this.scrollElement[scrollSizeProp] : 0;\n      const maxOffset = scrollSize - this.getSize();\n      return Math.max(Math.min(maxOffset, toOffset), 0);\n    };\n    this.getOffsetForIndex = (index, align = \"auto\") => {\n      index = Math.max(0, Math.min(index, this.options.count - 1));\n      const measurement = notUndefined(this.getMeasurements()[index]);\n      if (align === \"auto\") {\n        if (measurement.end >= this.scrollOffset + this.getSize() - this.options.scrollPaddingEnd) {\n          align = \"end\";\n        } else if (measurement.start <= this.scrollOffset + this.options.scrollPaddingStart) {\n          align = \"start\";\n        } else {\n          return [this.scrollOffset, align];\n        }\n      }\n      const toOffset = align === \"end\" ? measurement.end + this.options.scrollPaddingEnd : measurement.start - this.options.scrollPaddingStart;\n      return [this.getOffsetForAlignment(toOffset, align), align];\n    };\n    this.isDynamicMode = () => this.measureElementCache.size > 0;\n    this.cancelScrollToIndex = () => {\n      if (this.scrollToIndexTimeoutId !== null) {\n        clearTimeout(this.scrollToIndexTimeoutId);\n        this.scrollToIndexTimeoutId = null;\n      }\n    };\n    this.scrollToOffset = (toOffset, { align = \"start\", behavior } = {}) => {\n      this.cancelScrollToIndex();\n      if (behavior === \"smooth\" && this.isDynamicMode()) {\n        console.warn(\n          \"The `smooth` scroll behavior is not fully supported with dynamic size.\"\n        );\n      }\n      this._scrollToOffset(this.getOffsetForAlignment(toOffset, align), {\n        adjustments: void 0,\n        behavior\n      });\n    };\n    this.scrollToIndex = (index, { align: initialAlign = \"auto\", behavior } = {}) => {\n      index = Math.max(0, Math.min(index, this.options.count - 1));\n      this.cancelScrollToIndex();\n      if (behavior === \"smooth\" && this.isDynamicMode()) {\n        console.warn(\n          \"The `smooth` scroll behavior is not fully supported with dynamic size.\"\n        );\n      }\n      const [toOffset, align] = this.getOffsetForIndex(index, initialAlign);\n      this._scrollToOffset(toOffset, { adjustments: void 0, behavior });\n      if (behavior !== \"smooth\" && this.isDynamicMode()) {\n        this.scrollToIndexTimeoutId = setTimeout(() => {\n          this.scrollToIndexTimeoutId = null;\n          const elementInDOM = this.measureElementCache.has(\n            this.options.getItemKey(index)\n          );\n          if (elementInDOM) {\n            const [toOffset2] = this.getOffsetForIndex(index, align);\n            if (!approxEqual(toOffset2, this.scrollOffset)) {\n              this.scrollToIndex(index, { align, behavior });\n            }\n          } else {\n            this.scrollToIndex(index, { align, behavior });\n          }\n        });\n      }\n    };\n    this.scrollBy = (delta, { behavior } = {}) => {\n      this.cancelScrollToIndex();\n      if (behavior === \"smooth\" && this.isDynamicMode()) {\n        console.warn(\n          \"The `smooth` scroll behavior is not fully supported with dynamic size.\"\n        );\n      }\n      this._scrollToOffset(this.scrollOffset + delta, {\n        adjustments: void 0,\n        behavior\n      });\n    };\n    this.getTotalSize = () => {\n      var _a;\n      const measurements = this.getMeasurements();\n      let end;\n      if (measurements.length === 0) {\n        end = this.options.paddingStart;\n      } else {\n        end = this.options.lanes === 1 ? ((_a = measurements[measurements.length - 1]) == null ? void 0 : _a.end) ?? 0 : Math.max(\n          ...measurements.slice(-this.options.lanes).map((m) => m.end)\n        );\n      }\n      return end - this.options.scrollMargin + this.options.paddingEnd;\n    };\n    this._scrollToOffset = (offset, {\n      adjustments,\n      behavior\n    }) => {\n      this.options.scrollToFn(offset, { behavior, adjustments }, this);\n    };\n    this.measure = () => {\n      var _a, _b;\n      this.itemSizeCache = /* @__PURE__ */ new Map();\n      (_b = (_a = this.options).onChange) == null ? void 0 : _b.call(_a, this, false);\n    };\n    this.setOptions(opts);\n    this.scrollRect = this.options.initialRect;\n    this.scrollOffset = typeof this.options.initialOffset === \"function\" ? this.options.initialOffset() : this.options.initialOffset;\n    this.measurementsCache = this.options.initialMeasurementsCache;\n    this.measurementsCache.forEach((item) => {\n      this.itemSizeCache.set(item.key, item.size);\n    });\n    this.notify(false, false);\n  }\n}\nconst findNearestBinarySearch = (low, high, getCurrentValue, value) => {\n  while (low <= high) {\n    const middle = (low + high) / 2 | 0;\n    const currentValue = getCurrentValue(middle);\n    if (currentValue < value) {\n      low = middle + 1;\n    } else if (currentValue > value) {\n      high = middle - 1;\n    } else {\n      return middle;\n    }\n  }\n  if (low > 0) {\n    return low - 1;\n  } else {\n    return 0;\n  }\n};\nfunction calculateRange({\n  measurements,\n  outerSize,\n  scrollOffset\n}) {\n  const count = measurements.length - 1;\n  const getOffset = (index) => measurements[index].start;\n  const startIndex = findNearestBinarySearch(0, count, getOffset, scrollOffset);\n  let endIndex = startIndex;\n  while (endIndex < count && measurements[endIndex].end < scrollOffset + outerSize) {\n    endIndex++;\n  }\n  return { startIndex, endIndex };\n}\nexport {\n  Virtualizer,\n  approxEqual,\n  debounce,\n  defaultKeyExtractor,\n  defaultRangeExtractor,\n  elementScroll,\n  measureElement,\n  memo,\n  notUndefined,\n  observeElementOffset,\n  observeElementRect,\n  observeWindowOffset,\n  observeWindowRect,\n  windowScroll\n};\n//# sourceMappingURL=index.js.map\n","import * as React from \"react\";\nimport { flushSync } from \"react-dom\";\nimport { observeElementRect, observeElementOffset, elementScroll, observeWindowRect, observeWindowOffset, windowScroll, Virtualizer } from \"@tanstack/virtual-core\";\nexport * from \"@tanstack/virtual-core\";\nconst useIsomorphicLayoutEffect = typeof document !== \"undefined\" ? React.useLayoutEffect : React.useEffect;\nfunction useVirtualizerBase(options) {\n  const rerender = React.useReducer(() => ({}), {})[1];\n  const resolvedOptions = {\n    ...options,\n    onChange: (instance2, sync) => {\n      var _a;\n      if (sync) {\n        flushSync(rerender);\n      } else {\n        rerender();\n      }\n      (_a = options.onChange) == null ? void 0 : _a.call(options, instance2, sync);\n    }\n  };\n  const [instance] = React.useState(\n    () => new Virtualizer(resolvedOptions)\n  );\n  instance.setOptions(resolvedOptions);\n  React.useEffect(() => {\n    return instance._didMount();\n  }, []);\n  useIsomorphicLayoutEffect(() => {\n    return instance._willUpdate();\n  });\n  return instance;\n}\nfunction useVirtualizer(options) {\n  return useVirtualizerBase({\n    observeElementRect,\n    observeElementOffset,\n    scrollToFn: elementScroll,\n    ...options\n  });\n}\nfunction useWindowVirtualizer(options) {\n  return useVirtualizerBase({\n    getScrollElement: () => typeof document !== \"undefined\" ? window : null,\n    observeElementRect: observeWindowRect,\n    observeElementOffset: observeWindowOffset,\n    scrollToFn: windowScroll,\n    initialOffset: () => typeof document !== \"undefined\" ? window.scrollY : 0,\n    ...options\n  });\n}\nexport {\n  useVirtualizer,\n  useWindowVirtualizer\n};\n//# sourceMappingURL=index.js.map\n","import{useRef as r}from\"react\";import{useEvent as c}from'./use-event.js';import{useEventListener as i}from'./use-event-listener.js';function f(l){let n=r({value:\"\",selectionStart:null,selectionEnd:null});return i(l.current,\"blur\",e=>{let t=e.target;t instanceof HTMLInputElement&&(n.current={value:t.value,selectionStart:t.selectionStart,selectionEnd:t.selectionEnd})}),c(()=>{let e=l.current;if(document.activeElement!==e&&e instanceof HTMLInputElement&&e.isConnected){if(e.focus({preventScroll:!0}),e.value!==n.current.value)e.setSelectionRange(e.value.length,e.value.length);else{let{selectionStart:t,selectionEnd:u}=n.current;t!==null&&u!==null&&e.setSelectionRange(t,u)}n.current={value:\"\",selectionStart:null,selectionEnd:null}}})}export{f as useRefocusableInput};\n","var g=(f=>(f[f.Left=0]=\"Left\",f[f.Right=2]=\"Right\",f))(g||{});export{g as MouseButton};\n","\"use client\";import{useFocusRing as Oe}from\"@react-aria/focus\";import{useHover as Ce}from\"@react-aria/interactions\";import{useVirtualizer as we}from\"@tanstack/react-virtual\";import L,{Fragment as ye,createContext as ce,createRef as Be,useCallback as Re,useContext as fe,useMemo as H,useReducer as ke,useRef as G,useState as Se}from\"react\";import{useActivePress as Ne}from'../../hooks/use-active-press.js';import{useByComparator as Ue}from'../../hooks/use-by-comparator.js';import{useControllable as He}from'../../hooks/use-controllable.js';import{useDefaultValue as Ge}from'../../hooks/use-default-value.js';import{useDisposables as Pe}from'../../hooks/use-disposables.js';import{useElementSize as Ie}from'../../hooks/use-element-size.js';import{useEvent as T}from'../../hooks/use-event.js';import{useFrameDebounce as je}from'../../hooks/use-frame-debounce.js';import{useId as le}from'../../hooks/use-id.js';import{useInertOthers as Ke}from'../../hooks/use-inert-others.js';import{useIsoMorphicEffect as K}from'../../hooks/use-iso-morphic-effect.js';import{useLatestValue as We}from'../../hooks/use-latest-value.js';import{useOnDisappear as ze}from'../../hooks/use-on-disappear.js';import{useOutsideClick as $e}from'../../hooks/use-outside-click.js';import{useOwnerDocument as Ae}from'../../hooks/use-owner.js';import{useRefocusableInput as Ee}from'../../hooks/use-refocusable-input.js';import{useResolveButtonType as Xe}from'../../hooks/use-resolve-button-type.js';import{useScrollLock as Je}from'../../hooks/use-scroll-lock.js';import{useSyncRefs as ue}from'../../hooks/use-sync-refs.js';import{useTrackedPointer as qe}from'../../hooks/use-tracked-pointer.js';import{useTreeWalker as Ye}from'../../hooks/use-tree-walker.js';import{useWatch as _e}from'../../hooks/use-watch.js';import{useDisabled as Qe}from'../../internal/disabled.js';import{FloatingProvider as Ze,useFloatingPanel as eo,useFloatingPanelProps as oo,useFloatingReference as to,useResolvedAnchor as no}from'../../internal/floating.js';import{FormFields as ro}from'../../internal/form-fields.js';import{useProvidedId as io}from'../../internal/id.js';import{OpenClosedProvider as ao,State as pe,useOpenClosed as lo}from'../../internal/open-closed.js';import{history as Fe}from'../../utils/active-element-history.js';import{isDisabledReactIssue7711 as uo}from'../../utils/bugs.js';import{Focus as S,calculateActiveIndex as he}from'../../utils/calculate-active-index.js';import{disposables as De}from'../../utils/disposables.js';import{sortByDomNode as po}from'../../utils/focus-management.js';import{match as Y}from'../../utils/match.js';import{isMobile as so}from'../../utils/platform.js';import{RenderFeatures as Me,forwardRefWithAs as Z,mergeProps as me,render as ee}from'../../utils/render.js';import{useDescribedBy as bo}from'../description/description.js';import{Keys as M}from'../keyboard.js';import{Label as co,useLabelledBy as xe,useLabels as fo}from'../label/label.js';import{MouseButton as Ve}from'../mouse.js';import{Portal as mo}from'../portal/portal.js';var xo=(e=>(e[e.Open=0]=\"Open\",e[e.Closed=1]=\"Closed\",e))(xo||{}),To=(e=>(e[e.Single=0]=\"Single\",e[e.Multi=1]=\"Multi\",e))(To||{}),go=(t=>(t[t.Pointer=0]=\"Pointer\",t[t.Focus=1]=\"Focus\",t[t.Other=2]=\"Other\",t))(go||{}),vo=(i=>(i[i.OpenCombobox=0]=\"OpenCombobox\",i[i.CloseCombobox=1]=\"CloseCombobox\",i[i.GoToOption=2]=\"GoToOption\",i[i.RegisterOption=3]=\"RegisterOption\",i[i.UnregisterOption=4]=\"UnregisterOption\",i[i.SetActivationTrigger=5]=\"SetActivationTrigger\",i[i.UpdateVirtualConfiguration=6]=\"UpdateVirtualConfiguration\",i))(vo||{});function Te(o,r=e=>e){let e=o.activeOptionIndex!==null?o.options[o.activeOptionIndex]:null,t=r(o.options.slice()),c=t.length>0&&t[0].dataRef.current.order!==null?t.sort((d,i)=>d.dataRef.current.order-i.dataRef.current.order):po(t,d=>d.dataRef.current.domRef.current),s=e?c.indexOf(e):null;return s===-1&&(s=null),{options:c,activeOptionIndex:s}}let Oo={[1](o){var r;return(r=o.dataRef.current)!=null&&r.disabled||o.comboboxState===1?o:{...o,activeOptionIndex:null,comboboxState:1,activationTrigger:2,__demoMode:!1}},[0](o){var r,e;if((r=o.dataRef.current)!=null&&r.disabled||o.comboboxState===0)return o;if((e=o.dataRef.current)!=null&&e.value){let t=o.dataRef.current.calculateIndex(o.dataRef.current.value);if(t!==-1)return{...o,activeOptionIndex:t,comboboxState:0,__demoMode:!1}}return{...o,comboboxState:0,__demoMode:!1}},[2](o,r){var s,d,i,m,n;if((s=o.dataRef.current)!=null&&s.disabled||(d=o.dataRef.current)!=null&&d.optionsRef.current&&!((i=o.dataRef.current)!=null&&i.optionsPropsRef.current.static)&&o.comboboxState===1)return o;if(o.virtual){let{options:p,disabled:f}=o.virtual,_=r.focus===S.Specific?r.idx:he(r,{resolveItems:()=>p,resolveActiveIndex:()=>{var u,x;return(x=(u=o.activeOptionIndex)!=null?u:p.findIndex(V=>!f(V)))!=null?x:null},resolveDisabled:f,resolveId(){throw new Error(\"Function not implemented.\")}}),F=(m=r.trigger)!=null?m:2;return o.activeOptionIndex===_&&o.activationTrigger===F?o:{...o,activeOptionIndex:_,activationTrigger:F,__demoMode:!1}}let e=Te(o);if(e.activeOptionIndex===null){let p=e.options.findIndex(f=>!f.dataRef.current.disabled);p!==-1&&(e.activeOptionIndex=p)}let t=r.focus===S.Specific?r.idx:he(r,{resolveItems:()=>e.options,resolveActiveIndex:()=>e.activeOptionIndex,resolveId:p=>p.id,resolveDisabled:p=>p.dataRef.current.disabled}),c=(n=r.trigger)!=null?n:2;return o.activeOptionIndex===t&&o.activationTrigger===c?o:{...o,...e,activeOptionIndex:t,activationTrigger:c,__demoMode:!1}},[3]:(o,r)=>{var s,d,i;if((s=o.dataRef.current)!=null&&s.virtual)return{...o,options:[...o.options,r.payload]};let e=r.payload,t=Te(o,m=>(m.push(e),m));o.activeOptionIndex===null&&(d=o.dataRef.current)!=null&&d.isSelected(r.payload.dataRef.current.value)&&(t.activeOptionIndex=t.options.indexOf(e));let c={...o,...t,activationTrigger:2};return(i=o.dataRef.current)!=null&&i.__demoMode&&o.dataRef.current.value===void 0&&(c.activeOptionIndex=0),c},[4]:(o,r)=>{var t;if((t=o.dataRef.current)!=null&&t.virtual)return{...o,options:o.options.filter(c=>c.id!==r.id)};let e=Te(o,c=>{let s=c.findIndex(d=>d.id===r.id);return s!==-1&&c.splice(s,1),c});return{...o,...e,activationTrigger:2}},[5]:(o,r)=>o.activationTrigger===r.trigger?o:{...o,activationTrigger:r.trigger},[6]:(o,r)=>{var t,c;if(o.virtual===null)return{...o,virtual:{options:r.options,disabled:(t=r.disabled)!=null?t:()=>!1}};if(o.virtual.options===r.options&&o.virtual.disabled===r.disabled)return o;let e=o.activeOptionIndex;if(o.activeOptionIndex!==null){let s=r.options.indexOf(o.virtual.options[o.activeOptionIndex]);s!==-1?e=s:e=null}return{...o,activeOptionIndex:e,virtual:{options:r.options,disabled:(c=r.disabled)!=null?c:()=>!1}}}},ge=ce(null);ge.displayName=\"ComboboxActionsContext\";function oe(o){let r=fe(ge);if(r===null){let e=new Error(`<${o} /> is missing a parent <Combobox /> component.`);throw Error.captureStackTrace&&Error.captureStackTrace(e,oe),e}return r}let Le=ce(null);function Co(o){let r=Q(\"VirtualProvider\"),{options:e}=r.virtual,[t,c]=H(()=>{let n=r.optionsRef.current;if(!n)return[0,0];let p=window.getComputedStyle(n);return[parseFloat(p.paddingBlockStart||p.paddingTop),parseFloat(p.paddingBlockEnd||p.paddingBottom)]},[r.optionsRef.current]),s=we({scrollPaddingStart:t,scrollPaddingEnd:c,count:e.length,estimateSize(){return 40},getScrollElement(){var n;return(n=r.optionsRef.current)!=null?n:null},overscan:12}),[d,i]=Se(0);K(()=>{i(n=>n+1)},[e]);let m=s.getVirtualItems();return m.length===0?null:L.createElement(Le.Provider,{value:s},L.createElement(\"div\",{style:{position:\"relative\",width:\"100%\",height:`${s.getTotalSize()}px`},ref:n=>{if(n){if(typeof process!=\"undefined\"&&process.env.JEST_WORKER_ID!==void 0||r.activationTrigger===0)return;r.activeOptionIndex!==null&&e.length>r.activeOptionIndex&&s.scrollToIndex(r.activeOptionIndex)}}},m.map(n=>{var p;return L.createElement(ye,{key:n.key},L.cloneElement((p=o.children)==null?void 0:p.call(o,{option:e[n.index],open:r.comboboxState===0}),{key:`${d}-${n.key}`,\"data-index\":n.index,\"aria-setsize\":e.length,\"aria-posinset\":n.index+1,style:{position:\"absolute\",top:0,left:0,transform:`translateY(${n.start}px)`,overflowAnchor:\"none\"}}))})))}let se=ce(null);se.displayName=\"ComboboxDataContext\";function Q(o){let r=fe(se);if(r===null){let e=new Error(`<${o} /> is missing a parent <Combobox /> component.`);throw Error.captureStackTrace&&Error.captureStackTrace(e,Q),e}return r}function yo(o,r){return Y(r.type,Oo,o,r)}let Ro=ye;function So(o,r){var D,U;let e=Qe(),{value:t,defaultValue:c,onChange:s,form:d,name:i,by:m,disabled:n=e||!1,onClose:p,__demoMode:f=!1,multiple:_=!1,immediate:F=!1,virtual:u=null,nullable:x,...V}=o,P=Ge(c),[C=_?[]:void 0,y]=He(t,s,P),[I,A]=ke(yo,{dataRef:Be(),comboboxState:f?0:1,options:[],virtual:u?{options:u.options,disabled:(D=u.disabled)!=null?D:()=>!1}:null,activeOptionIndex:null,activationTrigger:2,__demoMode:f}),h=G(!1),w=G({static:!1,hold:!1}),O=G(null),W=G(null),z=G(null),g=Ue(m),$=T(b=>u?m===null?u.options.indexOf(b):u.options.findIndex(v=>g(v,b)):I.options.findIndex(v=>g(v.dataRef.current.value,b))),X=Re(b=>Y(a.mode,{[1]:()=>C.some(v=>g(v,b)),[0]:()=>g(C,b)}),[C]),J=T(b=>I.activeOptionIndex===$(b)),a=H(()=>({...I,immediate:F,optionsPropsRef:w,inputRef:O,buttonRef:W,optionsRef:z,value:C,defaultValue:P,disabled:n,mode:_?1:0,virtual:u?I.virtual:null,get activeOptionIndex(){if(h.current&&I.activeOptionIndex===null&&(u?u.options.length>0:I.options.length>0)){if(u){let v=u.options.findIndex(N=>{var ae,ve;return!((ve=(ae=u.disabled)==null?void 0:ae.call(u,N))!=null&&ve)});if(v!==-1)return v}let b=I.options.findIndex(v=>!v.dataRef.current.disabled);if(b!==-1)return b}return I.activeOptionIndex},calculateIndex:$,compare:g,isSelected:X,isActive:J}),[C,P,n,_,f,I,u]);K(()=>{var b;u&&A({type:6,options:u.options,disabled:(b=u.disabled)!=null?b:null})},[u,u==null?void 0:u.options,u==null?void 0:u.disabled]),K(()=>{I.dataRef.current=a},[a]),$e([a.buttonRef,a.inputRef,a.optionsRef],()=>l.closeCombobox(),a.comboboxState===0);let j=H(()=>{var b,v,N;return{open:a.comboboxState===0,disabled:n,activeIndex:a.activeOptionIndex,activeOption:a.activeOptionIndex===null?null:a.virtual?a.virtual.options[(b=a.activeOptionIndex)!=null?b:0]:(N=(v=a.options[a.activeOptionIndex])==null?void 0:v.dataRef.current.value)!=null?N:null,value:C}},[a,n,C]),de=T(()=>{if(a.activeOptionIndex!==null){if(a.virtual)q(a.virtual.options[a.activeOptionIndex]);else{let{dataRef:b}=a.options[a.activeOptionIndex];q(b.current.value)}l.goToOption(S.Specific,a.activeOptionIndex)}}),be=T(()=>{A({type:0}),h.current=!0}),te=T(()=>{A({type:1}),h.current=!1,p==null||p()}),ne=T((b,v,N)=>(h.current=!1,b===S.Specific?A({type:2,focus:S.Specific,idx:v,trigger:N}):A({type:2,focus:b,trigger:N}))),re=T((b,v)=>(A({type:3,payload:{id:b,dataRef:v}}),()=>{a.isActive(v.current.value)&&(h.current=!0),A({type:4,id:b})})),q=T(b=>Y(a.mode,{[0](){return y==null?void 0:y(b)},[1](){let v=a.value.slice(),N=v.findIndex(ae=>g(ae,b));return N===-1?v.push(b):v.splice(N,1),y==null?void 0:y(v)}})),ie=T(b=>{A({type:5,trigger:b})}),l=H(()=>({onChange:q,registerOption:re,goToOption:ne,closeCombobox:te,openCombobox:be,setActivationTrigger:ie,selectActiveOption:de}),[]),[B,E]=fo(),k=r===null?{}:{ref:r},R=Re(()=>{if(P!==void 0)return y==null?void 0:y(P)},[y,P]);return L.createElement(E,{value:B,props:{htmlFor:(U=a.inputRef.current)==null?void 0:U.id},slot:{open:a.comboboxState===0,disabled:n}},L.createElement(Ze,null,L.createElement(ge.Provider,{value:l},L.createElement(se.Provider,{value:a},L.createElement(ao,{value:Y(a.comboboxState,{[0]:pe.Open,[1]:pe.Closed})},i!=null&&L.createElement(ro,{disabled:n,data:C!=null?{[i]:C}:{},form:d,onReset:R}),ee({ourProps:k,theirProps:V,slot:j,defaultTag:Ro,name:\"Combobox\"}))))))}let Po=\"input\";function Io(o,r){var te,ne,re,q,ie;let e=Q(\"Combobox.Input\"),t=oe(\"Combobox.Input\"),c=le(),s=io(),{id:d=s||`headlessui-combobox-input-${c}`,onChange:i,displayValue:m,disabled:n=e.disabled||!1,autoFocus:p=!1,type:f=\"text\",..._}=o,F=ue(e.inputRef,r,to()),u=Ae(e.inputRef),x=G(!1),V=Pe(),P=T(()=>{t.onChange(null),e.optionsRef.current&&(e.optionsRef.current.scrollTop=0),t.goToOption(S.Nothing)}),C=H(()=>{var l;return typeof m==\"function\"&&e.value!==void 0?(l=m(e.value))!=null?l:\"\":typeof e.value==\"string\"?e.value:\"\"},[e.value,m]);_e(([l,B],[E,k])=>{if(x.current)return;let R=e.inputRef.current;R&&((k===0&&B===1||l!==E)&&(R.value=l),requestAnimationFrame(()=>{if(x.current||!R||(u==null?void 0:u.activeElement)!==R)return;let{selectionStart:D,selectionEnd:U}=R;Math.abs((U!=null?U:0)-(D!=null?D:0))===0&&D===0&&R.setSelectionRange(R.value.length,R.value.length)}))},[C,e.comboboxState,u]),_e(([l],[B])=>{if(l===0&&B===1){if(x.current)return;let E=e.inputRef.current;if(!E)return;let k=E.value,{selectionStart:R,selectionEnd:D,selectionDirection:U}=E;E.value=\"\",E.value=k,U!==null?E.setSelectionRange(R,D,U):E.setSelectionRange(R,D)}},[e.comboboxState]);let y=G(!1),I=T(()=>{y.current=!0}),A=T(()=>{V.nextFrame(()=>{y.current=!1})}),h=je(),w=T(l=>{switch(x.current=!0,h(()=>{x.current=!1}),l.key){case M.Enter:if(x.current=!1,e.comboboxState!==0||y.current)return;if(l.preventDefault(),l.stopPropagation(),e.activeOptionIndex===null){t.closeCombobox();return}t.selectActiveOption(),e.mode===0&&t.closeCombobox();break;case M.ArrowDown:return x.current=!1,l.preventDefault(),l.stopPropagation(),Y(e.comboboxState,{[0]:()=>t.goToOption(S.Next),[1]:()=>t.openCombobox()});case M.ArrowUp:return x.current=!1,l.preventDefault(),l.stopPropagation(),Y(e.comboboxState,{[0]:()=>t.goToOption(S.Previous),[1]:()=>{t.openCombobox(),V.nextFrame(()=>{e.value||t.goToOption(S.Last)})}});case M.Home:if(l.shiftKey)break;return x.current=!1,l.preventDefault(),l.stopPropagation(),t.goToOption(S.First);case M.PageUp:return x.current=!1,l.preventDefault(),l.stopPropagation(),t.goToOption(S.First);case M.End:if(l.shiftKey)break;return x.current=!1,l.preventDefault(),l.stopPropagation(),t.goToOption(S.Last);case M.PageDown:return x.current=!1,l.preventDefault(),l.stopPropagation(),t.goToOption(S.Last);case M.Escape:return x.current=!1,e.comboboxState!==0?void 0:(l.preventDefault(),e.optionsRef.current&&!e.optionsPropsRef.current.static&&l.stopPropagation(),e.mode===0&&e.value===null&&P(),t.closeCombobox());case M.Tab:if(x.current=!1,e.comboboxState!==0)return;e.mode===0&&e.activationTrigger!==1&&t.selectActiveOption(),t.closeCombobox();break}}),O=T(l=>{i==null||i(l),e.mode===0&&l.target.value===\"\"&&P(),t.openCombobox()}),W=T(l=>{var E,k,R;let B=(E=l.relatedTarget)!=null?E:Fe.find(D=>D!==l.currentTarget);if(x.current=!1,!((k=e.optionsRef.current)!=null&&k.contains(B))&&!((R=e.buttonRef.current)!=null&&R.contains(B))&&e.comboboxState===0)return l.preventDefault(),e.mode===0&&e.value===null&&P(),t.closeCombobox()}),z=T(l=>{var E,k,R;let B=(E=l.relatedTarget)!=null?E:Fe.find(D=>D!==l.currentTarget);(k=e.buttonRef.current)!=null&&k.contains(B)||(R=e.optionsRef.current)!=null&&R.contains(B)||e.disabled||e.immediate&&e.comboboxState!==0&&(t.openCombobox(),V.nextFrame(()=>{t.setActivationTrigger(1)}))}),g=xe(),$=bo(),{isFocused:X,focusProps:J}=Oe({autoFocus:p}),{isHovered:a,hoverProps:j}=Ce({isDisabled:n}),de=H(()=>({open:e.comboboxState===0,disabled:n,hover:a,focus:X,autofocus:p}),[e,a,X,p,n]),be=me({ref:F,id:d,role:\"combobox\",type:f,\"aria-controls\":(te=e.optionsRef.current)==null?void 0:te.id,\"aria-expanded\":e.comboboxState===0,\"aria-activedescendant\":e.activeOptionIndex===null?void 0:e.virtual?(ne=e.options.find(l=>!l.dataRef.current.disabled&&e.compare(l.dataRef.current.value,e.virtual.options[e.activeOptionIndex])))==null?void 0:ne.id:(re=e.options[e.activeOptionIndex])==null?void 0:re.id,\"aria-labelledby\":g,\"aria-describedby\":$,\"aria-autocomplete\":\"list\",defaultValue:(ie=(q=o.defaultValue)!=null?q:e.defaultValue!==void 0?m==null?void 0:m(e.defaultValue):null)!=null?ie:e.defaultValue,disabled:n||void 0,autoFocus:p,onCompositionStart:I,onCompositionEnd:A,onKeyDown:w,onChange:O,onFocus:z,onBlur:W},J,j);return ee({ourProps:be,theirProps:_,slot:de,defaultTag:Po,name:\"Combobox.Input\"})}let Ao=\"button\";function Eo(o,r){var w;let e=Q(\"Combobox.Button\"),t=oe(\"Combobox.Button\"),c=ue(e.buttonRef,r),s=le(),{id:d=`headlessui-combobox-button-${s}`,disabled:i=e.disabled||!1,autoFocus:m=!1,...n}=o,p=Pe(),f=Ee(e.inputRef),_=T(O=>{switch(O.key){case M.Space:case M.Enter:return O.preventDefault(),O.stopPropagation(),e.comboboxState===1&&t.openCombobox(),p.nextFrame(()=>f());case M.ArrowDown:return O.preventDefault(),O.stopPropagation(),e.comboboxState===1&&(t.openCombobox(),p.nextFrame(()=>{e.value||t.goToOption(S.First)})),p.nextFrame(()=>f());case M.ArrowUp:return O.preventDefault(),O.stopPropagation(),e.comboboxState===1&&(t.openCombobox(),p.nextFrame(()=>{e.value||t.goToOption(S.Last)})),p.nextFrame(()=>f());case M.Escape:return e.comboboxState!==0?void 0:(O.preventDefault(),e.optionsRef.current&&!e.optionsPropsRef.current.static&&O.stopPropagation(),t.closeCombobox(),p.nextFrame(()=>f()));default:return}}),F=T(O=>{O.preventDefault(),!uo(O.currentTarget)&&(O.button===Ve.Left&&(e.comboboxState===0?t.closeCombobox():t.openCombobox()),f())}),u=xe([d]),{isFocusVisible:x,focusProps:V}=Oe({autoFocus:m}),{isHovered:P,hoverProps:C}=Ce({isDisabled:i}),{pressed:y,pressProps:I}=Ne({disabled:i}),A=H(()=>({open:e.comboboxState===0,active:y||e.comboboxState===0,disabled:i,value:e.value,hover:P,focus:x}),[e,P,x,y,i]),h=me({ref:c,id:d,type:Xe(o,e.buttonRef),tabIndex:-1,\"aria-haspopup\":\"listbox\",\"aria-controls\":(w=e.optionsRef.current)==null?void 0:w.id,\"aria-expanded\":e.comboboxState===0,\"aria-labelledby\":u,disabled:i||void 0,autoFocus:m,onMouseDown:F,onKeyDown:_},V,C,I);return ee({ourProps:h,theirProps:n,slot:A,defaultTag:Ao,name:\"Combobox.Button\"})}let _o=\"div\",Fo=Me.RenderStrategy|Me.Static;function ho(o,r){var z;let e=le(),{id:t=`headlessui-combobox-options-${e}`,hold:c=!1,anchor:s,portal:d=!1,modal:i=!0,...m}=o,n=Q(\"Combobox.Options\"),p=oe(\"Combobox.Options\"),f=no(s);f&&(d=!0);let[_,F]=eo(f),u=oo(),x=ue(n.optionsRef,r,f?_:null),V=Ae(n.optionsRef),P=lo(),C=(()=>P!==null?(P&pe.Open)===pe.Open:n.comboboxState===0)();ze(n.inputRef,p.closeCombobox,C),Je(V,n.__demoMode?!1:i&&n.comboboxState===0),Ke({allowed:T(()=>[n.inputRef.current,n.buttonRef.current,n.optionsRef.current])},n.__demoMode?!1:i&&n.comboboxState===0),K(()=>{var g;n.optionsPropsRef.current.static=(g=o.static)!=null?g:!1},[n.optionsPropsRef,o.static]),K(()=>{n.optionsPropsRef.current.hold=c},[n.optionsPropsRef,c]),Ye({container:n.optionsRef.current,enabled:n.comboboxState===0,accept(g){return g.getAttribute(\"role\")===\"option\"?NodeFilter.FILTER_REJECT:g.hasAttribute(\"role\")?NodeFilter.FILTER_SKIP:NodeFilter.FILTER_ACCEPT},walk(g){g.setAttribute(\"role\",\"none\")}});let y=xe([(z=n.buttonRef.current)==null?void 0:z.id]),I=H(()=>({open:n.comboboxState===0,option:void 0}),[n]),A=T(()=>{p.setActivationTrigger(0)}),h=me(f?u():{},{\"aria-labelledby\":y,role:\"listbox\",\"aria-multiselectable\":n.mode===1?!0:void 0,id:t,ref:x,style:{...F,\"--input-width\":Ie(n.inputRef,!0).width,\"--button-width\":Ie(n.buttonRef,!0).width},onWheel:A});n.virtual&&C&&Object.assign(m,{children:L.createElement(Co,null,m.children)});let[w,O]=Se(n.value);n.value!==w&&n.comboboxState===0&&n.mode!==1&&O(n.value);let W=T(g=>n.compare(w,g));return L.createElement(mo,{enabled:d?o.static||C:!1},L.createElement(se.Provider,{value:n.mode===1?n:{...n,isSelected:W}},ee({ourProps:h,theirProps:m,slot:I,defaultTag:_o,features:Fo,visible:C,name:\"Combobox.Options\"})))}let Do=\"div\";function Mo(o,r){var g,$,X,J;let e=Q(\"Combobox.Option\"),t=oe(\"Combobox.Option\"),c=le(),{id:s=`headlessui-combobox-option-${c}`,value:d,disabled:i=(X=($=(g=e.virtual)==null?void 0:g.disabled)==null?void 0:$.call(g,d))!=null?X:!1,order:m=null,...n}=o,p=Ee(e.inputRef),f=e.virtual?e.activeOptionIndex===e.calculateIndex(d):e.activeOptionIndex===null?!1:((J=e.options[e.activeOptionIndex])==null?void 0:J.id)===s,_=e.isSelected(d),F=G(null),u=We({disabled:i,value:d,domRef:F,order:m}),x=fe(Le),V=ue(r,F,x?x.measureElement:null),P=T(()=>t.onChange(d));K(()=>t.registerOption(s,u),[u,s]);let C=G(!(e.virtual||e.__demoMode));K(()=>{if(!e.virtual&&!e.__demoMode)return De().requestAnimationFrame(()=>{C.current=!0})},[e.virtual,e.__demoMode]),K(()=>{if(C.current&&e.comboboxState===0&&f&&e.activationTrigger!==0)return De().requestAnimationFrame(()=>{var a,j;(j=(a=F.current)==null?void 0:a.scrollIntoView)==null||j.call(a,{block:\"nearest\"})})},[F,f,e.comboboxState,e.activationTrigger,e.activeOptionIndex]);let y=T(a=>{a.preventDefault(),a.button===Ve.Left&&(i||(P(),so()||requestAnimationFrame(()=>p()),e.mode===0&&t.closeCombobox()))}),I=T(()=>{if(i)return t.goToOption(S.Nothing);let a=e.calculateIndex(d);t.goToOption(S.Specific,a)}),A=qe(),h=T(a=>A.update(a)),w=T(a=>{if(!A.wasMoved(a)||i||f)return;let j=e.calculateIndex(d);t.goToOption(S.Specific,j,0)}),O=T(a=>{A.wasMoved(a)&&(i||f&&(e.optionsPropsRef.current.hold||t.goToOption(S.Nothing)))}),W=H(()=>({active:f,focus:f,selected:_,disabled:i}),[f,_,i]);return ee({ourProps:{id:s,ref:V,role:\"option\",tabIndex:i===!0?void 0:-1,\"aria-disabled\":i===!0?!0:void 0,\"aria-selected\":_,disabled:void 0,onMouseDown:y,onFocus:I,onPointerEnter:h,onMouseEnter:h,onPointerMove:w,onMouseMove:w,onPointerLeave:O,onMouseLeave:O},theirProps:n,slot:W,defaultTag:Do,name:\"Combobox.Option\"})}let Vo=Z(So),Lo=Z(Eo),wo=Z(Io),Bo=co,ko=Z(ho),No=Z(Mo),ht=Object.assign(Vo,{Input:wo,Button:Lo,Label:Bo,Options:ko,Option:No});export{ht as Combobox,Lo as ComboboxButton,wo as ComboboxInput,Bo as ComboboxLabel,No as ComboboxOption,ko as ComboboxOptions};\n","import{useDisposables as r}from'./use-disposables.js';import{useEvent as s}from'./use-event.js';function m(){let e=r();return s(o=>{e.dispose(),e.nextFrame(o)})}export{m as useFrameDebounce};\n","\"use client\";import k,{createContext as D,useContext as h,useMemo as T,useState as R}from\"react\";import{useEvent as v}from'../../hooks/use-event.js';import{useId as _}from'../../hooks/use-id.js';import{useIsoMorphicEffect as A}from'../../hooks/use-iso-morphic-effect.js';import{useSyncRefs as B}from'../../hooks/use-sync-refs.js';import{useDisabled as F}from'../../internal/disabled.js';import{useProvidedId as S}from'../../internal/id.js';import{forwardRefWithAs as M,render as H}from'../../utils/render.js';let c=D(null);c.displayName=\"LabelContext\";function P(){let r=h(c);if(r===null){let l=new Error(\"You used a <Label /> component, but it is not inside a relevant parent.\");throw Error.captureStackTrace&&Error.captureStackTrace(l,P),l}return r}function I(r){var a,e,o;let l=(e=(a=h(c))==null?void 0:a.value)!=null?e:void 0;return((o=r==null?void 0:r.length)!=null?o:0)>0?[l,...r].filter(Boolean).join(\" \"):l}function z({inherit:r=!1}={}){let l=I(),[a,e]=R([]),o=r?[l,...a].filter(Boolean):a;return[o.length>0?o.join(\" \"):void 0,T(()=>function(t){let s=v(i=>(e(p=>[...p,i]),()=>e(p=>{let u=p.slice(),d=u.indexOf(i);return d!==-1&&u.splice(d,1),u}))),m=T(()=>({register:s,slot:t.slot,name:t.name,props:t.props,value:t.value}),[s,t.slot,t.name,t.props,t.value]);return k.createElement(c.Provider,{value:m},t.children)},[e])]}let N=\"label\";function G(r,l){var y;let a=_(),e=P(),o=S(),g=F(),{id:t=`headlessui-label-${a}`,htmlFor:s=o!=null?o:(y=e.props)==null?void 0:y.htmlFor,passive:m=!1,...i}=r,p=B(l);A(()=>e.register(t),[t,e.register]);let u=v(L=>{let b=L.currentTarget;if(b instanceof HTMLLabelElement&&L.preventDefault(),e.props&&\"onClick\"in e.props&&typeof e.props.onClick==\"function\"&&e.props.onClick(L),b instanceof HTMLLabelElement){let n=document.getElementById(b.htmlFor);if(n){let E=n.getAttribute(\"disabled\");if(E===\"true\"||E===\"\")return;let x=n.getAttribute(\"aria-disabled\");if(x===\"true\"||x===\"\")return;(n instanceof HTMLInputElement&&(n.type===\"radio\"||n.type===\"checkbox\")||n.role===\"radio\"||n.role===\"checkbox\"||n.role===\"switch\")&&n.click(),n.focus({preventScroll:!0})}}}),d=g||!1,C=T(()=>({...e.slot,disabled:d}),[e.slot,d]),f={ref:p,...e.props,id:t,htmlFor:s,onClick:u};return m&&(\"onClick\"in f&&(delete f.htmlFor,delete f.onClick),\"onClick\"in i&&delete i.onClick),H({ourProps:f,theirProps:i,slot:C,defaultTag:s?N:\"div\",name:e.name||\"Label\"})}let U=M(G),K=Object.assign(U,{});export{K as Label,P as useLabelContext,I as useLabelledBy,z as useLabels};\n","import{useRef as a,useState as m}from\"react\";import{getOwnerDocument as d}from'../utils/owner.js';import{useDisposables as g}from'./use-disposables.js';import{useEvent as u}from'./use-event.js';function E(e){let t=e.width/2,n=e.height/2;return{top:e.clientY-n,right:e.clientX+t,bottom:e.clientY+n,left:e.clientX-t}}function P(e,t){return!(!e||!t||e.right<t.left||e.left>t.right||e.bottom<t.top||e.top>t.bottom)}function w({disabled:e=!1}={}){let t=a(null),[n,l]=m(!1),r=g(),o=u(()=>{t.current=null,l(!1),r.dispose()}),f=u(s=>{if(r.dispose(),t.current===null){t.current=s.currentTarget,l(!0);{let i=d(s.currentTarget);r.addEventListener(i,\"pointerup\",o,!1),r.addEventListener(i,\"pointermove\",c=>{if(t.current){let p=E(c);l(P(p,t.current.getBoundingClientRect()))}},!1),r.addEventListener(i,\"pointercancel\",o,!1)}}});return{pressed:n,pressProps:e?{}:{onPointerDown:f,onPointerUp:o,onClick:o}}}export{w as useActivePress};\n","import{useCallback as n}from\"react\";function l(e,r){return e!==null&&r!==null&&typeof e==\"object\"&&typeof r==\"object\"&&\"id\"in e&&\"id\"in r?e.id===r.id:e===r}function u(e=l){return n((r,t)=>{if(typeof e==\"string\"){let o=e;return(r==null?void 0:r[o])===(t==null?void 0:t[o])}return e(r,t)},[e])}export{u as useByComparator};\n","import{useRef as o,useState as f}from\"react\";import{useEvent as a}from'./use-event.js';function T(l,r,c){let[i,s]=f(c),e=l!==void 0,t=o(e),u=o(!1),d=o(!1);return e&&!t.current&&!u.current?(u.current=!0,t.current=e,console.error(\"A component is changing from uncontrolled to controlled. This may be caused by the value changing from undefined to a defined value, which should not happen.\")):!e&&t.current&&!d.current&&(d.current=!0,t.current=e,console.error(\"A component is changing from controlled to uncontrolled. This may be caused by the value changing from a defined value to undefined, which should not happen.\")),[e?l:i,a(n=>(e||s(n),r==null?void 0:r(n)))]}export{T as useControllable};\n","import{useState as u}from\"react\";function l(e){let[t]=u(e);return t}export{l as useDefaultValue};\n","import{useMemo as o,useReducer as c}from\"react\";import{useIsoMorphicEffect as h}from'./use-iso-morphic-effect.js';function s(e){if(e===null)return{width:0,height:0};let{width:n,height:t}=e.getBoundingClientRect();return{width:n,height:t}}function f(e,n=!1){let t=e===null?null:\"current\"in e?e.current:e,[l,u]=c(()=>({}),{}),r=o(()=>s(t),[t,l]);return h(()=>{if(!t)return;let i=new ResizeObserver(u);return i.observe(t),()=>{i.disconnect()}},[t]),n?{width:`${r.width}px`,height:`${r.height}px`}:r}export{f as useElementSize};\n","import{useState as o}from\"react\";import{useIsoMorphicEffect as r}from'./use-iso-morphic-effect.js';function i(t){var n;if(t.type)return t.type;let e=(n=t.as)!=null?n:\"button\";if(typeof e==\"string\"&&e.toLowerCase()===\"button\")return\"button\"}function T(t,e){let[n,u]=o(()=>i(t));return r(()=>{u(i(t))},[t.type,t.as]),r(()=>{n||e.current&&e.current instanceof HTMLButtonElement&&!e.current.hasAttribute(\"type\")&&u(\"button\")},[n,e]),n}export{T as useResolveButtonType};\n","import{useRef as o}from\"react\";function t(e){return[e.screenX,e.screenY]}function u(){let e=o([-1,-1]);return{wasMoved(r){let n=t(r);return e.current[0]===n[0]&&e.current[1]===n[1]?!1:(e.current=n,!0)},update(r){e.current=t(r)}}}export{u as useTrackedPointer};\n","import{useEffect as m,useRef as E}from\"react\";import{getOwnerDocument as T}from'../utils/owner.js';import{useIsoMorphicEffect as N}from'./use-iso-morphic-effect.js';function F({container:e,accept:t,walk:r,enabled:c=!0}){let o=E(t),l=E(r);m(()=>{o.current=t,l.current=r},[t,r]),N(()=>{if(!e||!c)return;let n=T(e);if(!n)return;let f=o.current,p=l.current,d=Object.assign(i=>f(i),{acceptNode:f}),u=n.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,d,!1);for(;u.nextNode();)p(u.currentNode)},[e,c,o,l])}export{F as useTreeWalker};\n","import { isShadowRoot, isHTMLElement } from '@floating-ui/utils/dom';\n\nfunction activeElement(doc) {\n  let activeElement = doc.activeElement;\n  while (((_activeElement = activeElement) == null || (_activeElement = _activeElement.shadowRoot) == null ? void 0 : _activeElement.activeElement) != null) {\n    var _activeElement;\n    activeElement = activeElement.shadowRoot.activeElement;\n  }\n  return activeElement;\n}\nfunction contains(parent, child) {\n  if (!parent || !child) {\n    return false;\n  }\n  const rootNode = child.getRootNode == null ? void 0 : child.getRootNode();\n\n  // First, attempt with faster native method\n  if (parent.contains(child)) {\n    return true;\n  }\n\n  // then fallback to custom implementation with Shadow DOM support\n  if (rootNode && isShadowRoot(rootNode)) {\n    let next = child;\n    while (next) {\n      if (parent === next) {\n        return true;\n      }\n      // @ts-ignore\n      next = next.parentNode || next.host;\n    }\n  }\n\n  // Give up, the result is false\n  return false;\n}\n// Avoid Chrome DevTools blue warning.\nfunction getPlatform() {\n  const uaData = navigator.userAgentData;\n  if (uaData != null && uaData.platform) {\n    return uaData.platform;\n  }\n  return navigator.platform;\n}\nfunction getUserAgent() {\n  const uaData = navigator.userAgentData;\n  if (uaData && Array.isArray(uaData.brands)) {\n    return uaData.brands.map(_ref => {\n      let {\n        brand,\n        version\n      } = _ref;\n      return brand + \"/\" + version;\n    }).join(' ');\n  }\n  return navigator.userAgent;\n}\n\n// License: https://github.com/adobe/react-spectrum/blob/b35d5c02fe900badccd0cf1a8f23bb593419f238/packages/@react-aria/utils/src/isVirtualEvent.ts\nfunction isVirtualClick(event) {\n  // FIXME: Firefox is now emitting a deprecation warning for `mozInputSource`.\n  // Try to find a workaround for this. `react-aria` source still has the check.\n  if (event.mozInputSource === 0 && event.isTrusted) {\n    return true;\n  }\n  if (isAndroid() && event.pointerType) {\n    return event.type === 'click' && event.buttons === 1;\n  }\n  return event.detail === 0 && !event.pointerType;\n}\nfunction isVirtualPointerEvent(event) {\n  if (isJSDOM()) return false;\n  return !isAndroid() && event.width === 0 && event.height === 0 || isAndroid() && event.width === 1 && event.height === 1 && event.pressure === 0 && event.detail === 0 && event.pointerType === 'mouse' ||\n  // iOS VoiceOver returns 0.333• for width/height.\n  event.width < 1 && event.height < 1 && event.pressure === 0 && event.detail === 0 && event.pointerType === 'touch';\n}\nfunction isSafari() {\n  // Chrome DevTools does not complain about navigator.vendor\n  return /apple/i.test(navigator.vendor);\n}\nfunction isAndroid() {\n  const re = /android/i;\n  return re.test(getPlatform()) || re.test(getUserAgent());\n}\nfunction isMac() {\n  return getPlatform().toLowerCase().startsWith('mac') && !navigator.maxTouchPoints;\n}\nfunction isJSDOM() {\n  return getUserAgent().includes('jsdom/');\n}\nfunction isMouseLikePointerType(pointerType, strict) {\n  // On some Linux machines with Chromium, mouse inputs return a `pointerType`\n  // of \"pen\": https://github.com/floating-ui/floating-ui/issues/2015\n  const values = ['mouse', 'pen'];\n  if (!strict) {\n    values.push('', undefined);\n  }\n  return values.includes(pointerType);\n}\nfunction isReactEvent(event) {\n  return 'nativeEvent' in event;\n}\nfunction isRootElement(element) {\n  return element.matches('html,body');\n}\nfunction getDocument(node) {\n  return (node == null ? void 0 : node.ownerDocument) || document;\n}\nfunction isEventTargetWithin(event, node) {\n  if (node == null) {\n    return false;\n  }\n  if ('composedPath' in event) {\n    return event.composedPath().includes(node);\n  }\n\n  // TS thinks `event` is of type never as it assumes all browsers support composedPath, but browsers without shadow dom don't\n  const e = event;\n  return e.target != null && node.contains(e.target);\n}\nfunction getTarget(event) {\n  if ('composedPath' in event) {\n    return event.composedPath()[0];\n  }\n\n  // TS thinks `event` is of type never as it assumes all browsers support\n  // `composedPath()`, but browsers without shadow DOM don't.\n  return event.target;\n}\nconst TYPEABLE_SELECTOR = \"input:not([type='hidden']):not([disabled]),\" + \"[contenteditable]:not([contenteditable='false']),textarea:not([disabled])\";\nfunction isTypeableElement(element) {\n  return isHTMLElement(element) && element.matches(TYPEABLE_SELECTOR);\n}\nfunction stopEvent(event) {\n  event.preventDefault();\n  event.stopPropagation();\n}\nfunction isTypeableCombobox(element) {\n  if (!element) return false;\n  return element.getAttribute('role') === 'combobox' && isTypeableElement(element);\n}\n\nexport { TYPEABLE_SELECTOR, activeElement, contains, getDocument, getPlatform, getTarget, getUserAgent, isAndroid, isEventTargetWithin, isJSDOM, isMac, isMouseLikePointerType, isReactEvent, isRootElement, isSafari, isTypeableCombobox, isTypeableElement, isVirtualClick, isVirtualPointerEvent, stopEvent };\n","import { computePosition, arrow as arrow$2, offset as offset$1, shift as shift$1, limitShift as limitShift$1, flip as flip$1, size as size$1, autoPlacement as autoPlacement$1, hide as hide$1, inline as inline$1 } from '@floating-ui/dom';\nexport { autoUpdate, computePosition, detectOverflow, getOverflowAncestors, platform } from '@floating-ui/dom';\nimport * as React from 'react';\nimport { useLayoutEffect, useEffect } from 'react';\nimport * as ReactDOM from 'react-dom';\n\nvar index = typeof document !== 'undefined' ? useLayoutEffect : useEffect;\n\n// Fork of `fast-deep-equal` that only does the comparisons we need and compares\n// functions\nfunction deepEqual(a, b) {\n  if (a === b) {\n    return true;\n  }\n  if (typeof a !== typeof b) {\n    return false;\n  }\n  if (typeof a === 'function' && a.toString() === b.toString()) {\n    return true;\n  }\n  let length;\n  let i;\n  let keys;\n  if (a && b && typeof a === 'object') {\n    if (Array.isArray(a)) {\n      length = a.length;\n      if (length !== b.length) return false;\n      for (i = length; i-- !== 0;) {\n        if (!deepEqual(a[i], b[i])) {\n          return false;\n        }\n      }\n      return true;\n    }\n    keys = Object.keys(a);\n    length = keys.length;\n    if (length !== Object.keys(b).length) {\n      return false;\n    }\n    for (i = length; i-- !== 0;) {\n      if (!{}.hasOwnProperty.call(b, keys[i])) {\n        return false;\n      }\n    }\n    for (i = length; i-- !== 0;) {\n      const key = keys[i];\n      if (key === '_owner' && a.$$typeof) {\n        continue;\n      }\n      if (!deepEqual(a[key], b[key])) {\n        return false;\n      }\n    }\n    return true;\n  }\n  return a !== a && b !== b;\n}\n\nfunction getDPR(element) {\n  if (typeof window === 'undefined') {\n    return 1;\n  }\n  const win = element.ownerDocument.defaultView || window;\n  return win.devicePixelRatio || 1;\n}\n\nfunction roundByDPR(element, value) {\n  const dpr = getDPR(element);\n  return Math.round(value * dpr) / dpr;\n}\n\nfunction useLatestRef(value) {\n  const ref = React.useRef(value);\n  index(() => {\n    ref.current = value;\n  });\n  return ref;\n}\n\n/**\n * Provides data to position a floating element.\n * @see https://floating-ui.com/docs/useFloating\n */\nfunction useFloating(options) {\n  if (options === void 0) {\n    options = {};\n  }\n  const {\n    placement = 'bottom',\n    strategy = 'absolute',\n    middleware = [],\n    platform,\n    elements: {\n      reference: externalReference,\n      floating: externalFloating\n    } = {},\n    transform = true,\n    whileElementsMounted,\n    open\n  } = options;\n  const [data, setData] = React.useState({\n    x: 0,\n    y: 0,\n    strategy,\n    placement,\n    middlewareData: {},\n    isPositioned: false\n  });\n  const [latestMiddleware, setLatestMiddleware] = React.useState(middleware);\n  if (!deepEqual(latestMiddleware, middleware)) {\n    setLatestMiddleware(middleware);\n  }\n  const [_reference, _setReference] = React.useState(null);\n  const [_floating, _setFloating] = React.useState(null);\n  const setReference = React.useCallback(node => {\n    if (node !== referenceRef.current) {\n      referenceRef.current = node;\n      _setReference(node);\n    }\n  }, []);\n  const setFloating = React.useCallback(node => {\n    if (node !== floatingRef.current) {\n      floatingRef.current = node;\n      _setFloating(node);\n    }\n  }, []);\n  const referenceEl = externalReference || _reference;\n  const floatingEl = externalFloating || _floating;\n  const referenceRef = React.useRef(null);\n  const floatingRef = React.useRef(null);\n  const dataRef = React.useRef(data);\n  const hasWhileElementsMounted = whileElementsMounted != null;\n  const whileElementsMountedRef = useLatestRef(whileElementsMounted);\n  const platformRef = useLatestRef(platform);\n  const update = React.useCallback(() => {\n    if (!referenceRef.current || !floatingRef.current) {\n      return;\n    }\n    const config = {\n      placement,\n      strategy,\n      middleware: latestMiddleware\n    };\n    if (platformRef.current) {\n      config.platform = platformRef.current;\n    }\n    computePosition(referenceRef.current, floatingRef.current, config).then(data => {\n      const fullData = {\n        ...data,\n        isPositioned: true\n      };\n      if (isMountedRef.current && !deepEqual(dataRef.current, fullData)) {\n        dataRef.current = fullData;\n        ReactDOM.flushSync(() => {\n          setData(fullData);\n        });\n      }\n    });\n  }, [latestMiddleware, placement, strategy, platformRef]);\n  index(() => {\n    if (open === false && dataRef.current.isPositioned) {\n      dataRef.current.isPositioned = false;\n      setData(data => ({\n        ...data,\n        isPositioned: false\n      }));\n    }\n  }, [open]);\n  const isMountedRef = React.useRef(false);\n  index(() => {\n    isMountedRef.current = true;\n    return () => {\n      isMountedRef.current = false;\n    };\n  }, []);\n  index(() => {\n    if (referenceEl) referenceRef.current = referenceEl;\n    if (floatingEl) floatingRef.current = floatingEl;\n    if (referenceEl && floatingEl) {\n      if (whileElementsMountedRef.current) {\n        return whileElementsMountedRef.current(referenceEl, floatingEl, update);\n      }\n      update();\n    }\n  }, [referenceEl, floatingEl, update, whileElementsMountedRef, hasWhileElementsMounted]);\n  const refs = React.useMemo(() => ({\n    reference: referenceRef,\n    floating: floatingRef,\n    setReference,\n    setFloating\n  }), [setReference, setFloating]);\n  const elements = React.useMemo(() => ({\n    reference: referenceEl,\n    floating: floatingEl\n  }), [referenceEl, floatingEl]);\n  const floatingStyles = React.useMemo(() => {\n    const initialStyles = {\n      position: strategy,\n      left: 0,\n      top: 0\n    };\n    if (!elements.floating) {\n      return initialStyles;\n    }\n    const x = roundByDPR(elements.floating, data.x);\n    const y = roundByDPR(elements.floating, data.y);\n    if (transform) {\n      return {\n        ...initialStyles,\n        transform: \"translate(\" + x + \"px, \" + y + \"px)\",\n        ...(getDPR(elements.floating) >= 1.5 && {\n          willChange: 'transform'\n        })\n      };\n    }\n    return {\n      position: strategy,\n      left: x,\n      top: y\n    };\n  }, [strategy, transform, elements.floating, data.x, data.y]);\n  return React.useMemo(() => ({\n    ...data,\n    update,\n    refs,\n    elements,\n    floatingStyles\n  }), [data, update, refs, elements, floatingStyles]);\n}\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * This wraps the core `arrow` middleware to allow React refs as the element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow$1 = options => {\n  function isRef(value) {\n    return {}.hasOwnProperty.call(value, 'current');\n  }\n  return {\n    name: 'arrow',\n    options,\n    fn(state) {\n      const {\n        element,\n        padding\n      } = typeof options === 'function' ? options(state) : options;\n      if (element && isRef(element)) {\n        if (element.current != null) {\n          return arrow$2({\n            element: element.current,\n            padding\n          }).fn(state);\n        }\n        return {};\n      }\n      if (element) {\n        return arrow$2({\n          element,\n          padding\n        }).fn(state);\n      }\n      return {};\n    }\n  };\n};\n\n/**\n * Modifies the placement by translating the floating element along the\n * specified axes.\n * A number (shorthand for `mainAxis` or distance), or an axes configuration\n * object may be passed.\n * @see https://floating-ui.com/docs/offset\n */\nconst offset = (options, deps) => ({\n  ...offset$1(options),\n  options: [options, deps]\n});\n\n/**\n * Optimizes the visibility of the floating element by shifting it in order to\n * keep it in view when it will overflow the clipping boundary.\n * @see https://floating-ui.com/docs/shift\n */\nconst shift = (options, deps) => ({\n  ...shift$1(options),\n  options: [options, deps]\n});\n/**\n * Built-in `limiter` that will stop `shift()` at a certain point.\n */\nconst limitShift = (options, deps) => ({\n  ...limitShift$1(options),\n  options: [options, deps]\n});\n\n/**\n * Optimizes the visibility of the floating element by flipping the `placement`\n * in order to keep it in view when the preferred placement(s) will overflow the\n * clipping boundary. Alternative to `autoPlacement`.\n * @see https://floating-ui.com/docs/flip\n */\nconst flip = (options, deps) => ({\n  ...flip$1(options),\n  options: [options, deps]\n});\n\n/**\n * Provides data that allows you to change the size of the floating element —\n * for instance, prevent it from overflowing the clipping boundary or match the\n * width of the reference element.\n * @see https://floating-ui.com/docs/size\n */\nconst size = (options, deps) => ({\n  ...size$1(options),\n  options: [options, deps]\n});\n\n/**\n * Optimizes the visibility of the floating element by choosing the placement\n * that has the most space available automatically, without needing to specify a\n * preferred placement. Alternative to `flip`.\n * @see https://floating-ui.com/docs/autoPlacement\n */\nconst autoPlacement = (options, deps) => ({\n  ...autoPlacement$1(options),\n  options: [options, deps]\n});\n\n/**\n * Provides data to hide the floating element in applicable situations, such as\n * when it is not in the same clipping context as the reference element.\n * @see https://floating-ui.com/docs/hide\n */\nconst hide = (options, deps) => ({\n  ...hide$1(options),\n  options: [options, deps]\n});\n\n/**\n * Provides improved positioning for inline reference elements that can span\n * over multiple lines, such as hyperlinks or range selections.\n * @see https://floating-ui.com/docs/inline\n */\nconst inline = (options, deps) => ({\n  ...inline$1(options),\n  options: [options, deps]\n});\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * This wraps the core `arrow` middleware to allow React refs as the element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = (options, deps) => ({\n  ...arrow$1(options),\n  options: [options, deps]\n});\n\nexport { arrow, autoPlacement, flip, hide, inline, limitShift, offset, shift, size, useFloating };\n","function getNodeName(node) {\n  if (isNode(node)) {\n    return (node.nodeName || '').toLowerCase();\n  }\n  // Mocked nodes in testing environments may not be instances of Node. By\n  // returning `#document` an infinite loop won't occur.\n  // https://github.com/floating-ui/floating-ui/issues/2317\n  return '#document';\n}\nfunction getWindow(node) {\n  var _node$ownerDocument;\n  return (node == null || (_node$ownerDocument = node.ownerDocument) == null ? void 0 : _node$ownerDocument.defaultView) || window;\n}\nfunction getDocumentElement(node) {\n  var _ref;\n  return (_ref = (isNode(node) ? node.ownerDocument : node.document) || window.document) == null ? void 0 : _ref.documentElement;\n}\nfunction isNode(value) {\n  return value instanceof Node || value instanceof getWindow(value).Node;\n}\nfunction isElement(value) {\n  return value instanceof Element || value instanceof getWindow(value).Element;\n}\nfunction isHTMLElement(value) {\n  return value instanceof HTMLElement || value instanceof getWindow(value).HTMLElement;\n}\nfunction isShadowRoot(value) {\n  // Browsers without `ShadowRoot` support.\n  if (typeof ShadowRoot === 'undefined') {\n    return false;\n  }\n  return value instanceof ShadowRoot || value instanceof getWindow(value).ShadowRoot;\n}\nfunction isOverflowElement(element) {\n  const {\n    overflow,\n    overflowX,\n    overflowY,\n    display\n  } = getComputedStyle(element);\n  return /auto|scroll|overlay|hidden|clip/.test(overflow + overflowY + overflowX) && !['inline', 'contents'].includes(display);\n}\nfunction isTableElement(element) {\n  return ['table', 'td', 'th'].includes(getNodeName(element));\n}\nfunction isContainingBlock(element) {\n  const webkit = isWebKit();\n  const css = getComputedStyle(element);\n\n  // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n  return css.transform !== 'none' || css.perspective !== 'none' || (css.containerType ? css.containerType !== 'normal' : false) || !webkit && (css.backdropFilter ? css.backdropFilter !== 'none' : false) || !webkit && (css.filter ? css.filter !== 'none' : false) || ['transform', 'perspective', 'filter'].some(value => (css.willChange || '').includes(value)) || ['paint', 'layout', 'strict', 'content'].some(value => (css.contain || '').includes(value));\n}\nfunction getContainingBlock(element) {\n  let currentNode = getParentNode(element);\n  while (isHTMLElement(currentNode) && !isLastTraversableNode(currentNode)) {\n    if (isContainingBlock(currentNode)) {\n      return currentNode;\n    }\n    currentNode = getParentNode(currentNode);\n  }\n  return null;\n}\nfunction isWebKit() {\n  if (typeof CSS === 'undefined' || !CSS.supports) return false;\n  return CSS.supports('-webkit-backdrop-filter', 'none');\n}\nfunction isLastTraversableNode(node) {\n  return ['html', 'body', '#document'].includes(getNodeName(node));\n}\nfunction getComputedStyle(element) {\n  return getWindow(element).getComputedStyle(element);\n}\nfunction getNodeScroll(element) {\n  if (isElement(element)) {\n    return {\n      scrollLeft: element.scrollLeft,\n      scrollTop: element.scrollTop\n    };\n  }\n  return {\n    scrollLeft: element.pageXOffset,\n    scrollTop: element.pageYOffset\n  };\n}\nfunction getParentNode(node) {\n  if (getNodeName(node) === 'html') {\n    return node;\n  }\n  const result =\n  // Step into the shadow DOM of the parent of a slotted node.\n  node.assignedSlot ||\n  // DOM Element detected.\n  node.parentNode ||\n  // ShadowRoot detected.\n  isShadowRoot(node) && node.host ||\n  // Fallback.\n  getDocumentElement(node);\n  return isShadowRoot(result) ? result.host : result;\n}\nfunction getNearestOverflowAncestor(node) {\n  const parentNode = getParentNode(node);\n  if (isLastTraversableNode(parentNode)) {\n    return node.ownerDocument ? node.ownerDocument.body : node.body;\n  }\n  if (isHTMLElement(parentNode) && isOverflowElement(parentNode)) {\n    return parentNode;\n  }\n  return getNearestOverflowAncestor(parentNode);\n}\nfunction getOverflowAncestors(node, list, traverseIframes) {\n  var _node$ownerDocument2;\n  if (list === void 0) {\n    list = [];\n  }\n  if (traverseIframes === void 0) {\n    traverseIframes = true;\n  }\n  const scrollableAncestor = getNearestOverflowAncestor(node);\n  const isBody = scrollableAncestor === ((_node$ownerDocument2 = node.ownerDocument) == null ? void 0 : _node$ownerDocument2.body);\n  const win = getWindow(scrollableAncestor);\n  if (isBody) {\n    return list.concat(win, win.visualViewport || [], isOverflowElement(scrollableAncestor) ? scrollableAncestor : [], win.frameElement && traverseIframes ? getOverflowAncestors(win.frameElement) : []);\n  }\n  return list.concat(scrollableAncestor, getOverflowAncestors(scrollableAncestor, [], traverseIframes));\n}\n\nexport { getComputedStyle, getContainingBlock, getDocumentElement, getNearestOverflowAncestor, getNodeName, getNodeScroll, getOverflowAncestors, getParentNode, getWindow, isContainingBlock, isElement, isHTMLElement, isLastTraversableNode, isNode, isOverflowElement, isShadowRoot, isTableElement, isWebKit };\n","import * as React from 'react';\nimport { useLayoutEffect, useEffect, useRef } from 'react';\nimport { stopEvent, getDocument, isMouseLikePointerType, contains, activeElement, isSafari, isTypeableCombobox, isVirtualClick, isVirtualPointerEvent, getTarget, getPlatform, isTypeableElement, isReactEvent, isRootElement, isEventTargetWithin, isMac, getUserAgent } from '@floating-ui/react/utils';\nimport { floor } from '@floating-ui/utils';\nimport { platform, getOverflowAncestors, useFloating as useFloating$1, offset, detectOverflow } from '@floating-ui/react-dom';\nexport { arrow, autoPlacement, autoUpdate, computePosition, detectOverflow, flip, getOverflowAncestors, hide, inline, limitShift, offset, platform, shift, size } from '@floating-ui/react-dom';\nimport { isElement, getNodeName, isHTMLElement, getWindow, isLastTraversableNode, getParentNode, getComputedStyle } from '@floating-ui/utils/dom';\nimport { tabbable, isTabbable } from 'tabbable';\nimport { createPortal, flushSync } from 'react-dom';\n\n/**\n * Merges an array of refs into a single memoized callback ref or `null`.\n * @see https://floating-ui.com/docs/react-utils#usemergerefs\n */\nfunction useMergeRefs(refs) {\n  return React.useMemo(() => {\n    if (refs.every(ref => ref == null)) {\n      return null;\n    }\n    return value => {\n      refs.forEach(ref => {\n        if (typeof ref === 'function') {\n          ref(value);\n        } else if (ref != null) {\n          ref.current = value;\n        }\n      });\n    };\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, refs);\n}\n\n// https://github.com/mui/material-ui/issues/41190#issuecomment-2040873379\nconst SafeReact = {\n  ...React\n};\n\nconst useInsertionEffect = SafeReact.useInsertionEffect;\nconst useSafeInsertionEffect = useInsertionEffect || (fn => fn());\nfunction useEffectEvent(callback) {\n  const ref = React.useRef(() => {\n    if (process.env.NODE_ENV !== \"production\") {\n      throw new Error('Cannot call an event handler while rendering.');\n    }\n  });\n  useSafeInsertionEffect(() => {\n    ref.current = callback;\n  });\n  return React.useCallback(function () {\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n    return ref.current == null ? void 0 : ref.current(...args);\n  }, []);\n}\n\nconst ARROW_UP = 'ArrowUp';\nconst ARROW_DOWN = 'ArrowDown';\nconst ARROW_LEFT = 'ArrowLeft';\nconst ARROW_RIGHT = 'ArrowRight';\nfunction isDifferentRow(index, cols, prevRow) {\n  return Math.floor(index / cols) !== prevRow;\n}\nfunction isIndexOutOfBounds(listRef, index) {\n  return index < 0 || index >= listRef.current.length;\n}\nfunction getMinIndex(listRef, disabledIndices) {\n  return findNonDisabledIndex(listRef, {\n    disabledIndices\n  });\n}\nfunction getMaxIndex(listRef, disabledIndices) {\n  return findNonDisabledIndex(listRef, {\n    decrement: true,\n    startingIndex: listRef.current.length,\n    disabledIndices\n  });\n}\nfunction findNonDisabledIndex(listRef, _temp) {\n  let {\n    startingIndex = -1,\n    decrement = false,\n    disabledIndices,\n    amount = 1\n  } = _temp === void 0 ? {} : _temp;\n  const list = listRef.current;\n  let index = startingIndex;\n  do {\n    index += decrement ? -amount : amount;\n  } while (index >= 0 && index <= list.length - 1 && isDisabled(list, index, disabledIndices));\n  return index;\n}\nfunction getGridNavigatedIndex(elementsRef, _ref) {\n  let {\n    event,\n    orientation,\n    loop,\n    cols,\n    disabledIndices,\n    minIndex,\n    maxIndex,\n    prevIndex,\n    stopEvent: stop = false\n  } = _ref;\n  let nextIndex = prevIndex;\n  if (event.key === ARROW_UP) {\n    stop && stopEvent(event);\n    if (prevIndex === -1) {\n      nextIndex = maxIndex;\n    } else {\n      nextIndex = findNonDisabledIndex(elementsRef, {\n        startingIndex: nextIndex,\n        amount: cols,\n        decrement: true,\n        disabledIndices\n      });\n      if (loop && (prevIndex - cols < minIndex || nextIndex < 0)) {\n        const col = prevIndex % cols;\n        const maxCol = maxIndex % cols;\n        const offset = maxIndex - (maxCol - col);\n        if (maxCol === col) {\n          nextIndex = maxIndex;\n        } else {\n          nextIndex = maxCol > col ? offset : offset - cols;\n        }\n      }\n    }\n    if (isIndexOutOfBounds(elementsRef, nextIndex)) {\n      nextIndex = prevIndex;\n    }\n  }\n  if (event.key === ARROW_DOWN) {\n    stop && stopEvent(event);\n    if (prevIndex === -1) {\n      nextIndex = minIndex;\n    } else {\n      nextIndex = findNonDisabledIndex(elementsRef, {\n        startingIndex: prevIndex,\n        amount: cols,\n        disabledIndices\n      });\n      if (loop && prevIndex + cols > maxIndex) {\n        nextIndex = findNonDisabledIndex(elementsRef, {\n          startingIndex: prevIndex % cols - cols,\n          amount: cols,\n          disabledIndices\n        });\n      }\n    }\n    if (isIndexOutOfBounds(elementsRef, nextIndex)) {\n      nextIndex = prevIndex;\n    }\n  }\n\n  // Remains on the same row/column.\n  if (orientation === 'both') {\n    const prevRow = floor(prevIndex / cols);\n    if (event.key === ARROW_RIGHT) {\n      stop && stopEvent(event);\n      if (prevIndex % cols !== cols - 1) {\n        nextIndex = findNonDisabledIndex(elementsRef, {\n          startingIndex: prevIndex,\n          disabledIndices\n        });\n        if (loop && isDifferentRow(nextIndex, cols, prevRow)) {\n          nextIndex = findNonDisabledIndex(elementsRef, {\n            startingIndex: prevIndex - prevIndex % cols - 1,\n            disabledIndices\n          });\n        }\n      } else if (loop) {\n        nextIndex = findNonDisabledIndex(elementsRef, {\n          startingIndex: prevIndex - prevIndex % cols - 1,\n          disabledIndices\n        });\n      }\n      if (isDifferentRow(nextIndex, cols, prevRow)) {\n        nextIndex = prevIndex;\n      }\n    }\n    if (event.key === ARROW_LEFT) {\n      stop && stopEvent(event);\n      if (prevIndex % cols !== 0) {\n        nextIndex = findNonDisabledIndex(elementsRef, {\n          startingIndex: prevIndex,\n          decrement: true,\n          disabledIndices\n        });\n        if (loop && isDifferentRow(nextIndex, cols, prevRow)) {\n          nextIndex = findNonDisabledIndex(elementsRef, {\n            startingIndex: prevIndex + (cols - prevIndex % cols),\n            decrement: true,\n            disabledIndices\n          });\n        }\n      } else if (loop) {\n        nextIndex = findNonDisabledIndex(elementsRef, {\n          startingIndex: prevIndex + (cols - prevIndex % cols),\n          decrement: true,\n          disabledIndices\n        });\n      }\n      if (isDifferentRow(nextIndex, cols, prevRow)) {\n        nextIndex = prevIndex;\n      }\n    }\n    const lastRow = floor(maxIndex / cols) === prevRow;\n    if (isIndexOutOfBounds(elementsRef, nextIndex)) {\n      if (loop && lastRow) {\n        nextIndex = event.key === ARROW_LEFT ? maxIndex : findNonDisabledIndex(elementsRef, {\n          startingIndex: prevIndex - prevIndex % cols - 1,\n          disabledIndices\n        });\n      } else {\n        nextIndex = prevIndex;\n      }\n    }\n  }\n  return nextIndex;\n}\n\n/** For each cell index, gets the item index that occupies that cell */\nfunction buildCellMap(sizes, cols, dense) {\n  const cellMap = [];\n  let startIndex = 0;\n  sizes.forEach((_ref2, index) => {\n    let {\n      width,\n      height\n    } = _ref2;\n    if (width > cols) {\n      if (process.env.NODE_ENV !== \"production\") {\n        throw new Error(\"[Floating UI]: Invalid grid - item width at index \" + index + \" is greater than grid columns\");\n      }\n    }\n    let itemPlaced = false;\n    if (dense) {\n      startIndex = 0;\n    }\n    while (!itemPlaced) {\n      const targetCells = [];\n      for (let i = 0; i < width; i++) {\n        for (let j = 0; j < height; j++) {\n          targetCells.push(startIndex + i + j * cols);\n        }\n      }\n      if (startIndex % cols + width <= cols && targetCells.every(cell => cellMap[cell] == null)) {\n        targetCells.forEach(cell => {\n          cellMap[cell] = index;\n        });\n        itemPlaced = true;\n      } else {\n        startIndex++;\n      }\n    }\n  });\n\n  // convert into a non-sparse array\n  return [...cellMap];\n}\n\n/** Gets cell index of an item's corner or -1 when index is -1. */\nfunction getCellIndexOfCorner(index, sizes, cellMap, cols, corner) {\n  if (index === -1) return -1;\n  const firstCellIndex = cellMap.indexOf(index);\n  const sizeItem = sizes[index];\n  switch (corner) {\n    case 'tl':\n      return firstCellIndex;\n    case 'tr':\n      if (!sizeItem) {\n        return firstCellIndex;\n      }\n      return firstCellIndex + sizeItem.width - 1;\n    case 'bl':\n      if (!sizeItem) {\n        return firstCellIndex;\n      }\n      return firstCellIndex + (sizeItem.height - 1) * cols;\n    case 'br':\n      return cellMap.lastIndexOf(index);\n  }\n}\n\n/** Gets all cell indices that correspond to the specified indices */\nfunction getCellIndices(indices, cellMap) {\n  return cellMap.flatMap((index, cellIndex) => indices.includes(index) ? [cellIndex] : []);\n}\nfunction isDisabled(list, index, disabledIndices) {\n  if (disabledIndices) {\n    return disabledIndices.includes(index);\n  }\n  const element = list[index];\n  return element == null || element.hasAttribute('disabled') || element.getAttribute('aria-disabled') === 'true';\n}\n\nlet rafId = 0;\nfunction enqueueFocus(el, options) {\n  if (options === void 0) {\n    options = {};\n  }\n  const {\n    preventScroll = false,\n    cancelPrevious = true,\n    sync = false\n  } = options;\n  cancelPrevious && cancelAnimationFrame(rafId);\n  const exec = () => el == null ? void 0 : el.focus({\n    preventScroll\n  });\n  if (sync) {\n    exec();\n  } else {\n    rafId = requestAnimationFrame(exec);\n  }\n}\n\nvar index = typeof document !== 'undefined' ? useLayoutEffect : useEffect;\n\nfunction sortByDocumentPosition(a, b) {\n  const position = a.compareDocumentPosition(b);\n  if (position & Node.DOCUMENT_POSITION_FOLLOWING || position & Node.DOCUMENT_POSITION_CONTAINED_BY) {\n    return -1;\n  }\n  if (position & Node.DOCUMENT_POSITION_PRECEDING || position & Node.DOCUMENT_POSITION_CONTAINS) {\n    return 1;\n  }\n  return 0;\n}\nfunction areMapsEqual(map1, map2) {\n  if (map1.size !== map2.size) {\n    return false;\n  }\n  for (const [key, value] of map1.entries()) {\n    if (value !== map2.get(key)) {\n      return false;\n    }\n  }\n  return true;\n}\nconst FloatingListContext = /*#__PURE__*/React.createContext({\n  register: () => {},\n  unregister: () => {},\n  map: /*#__PURE__*/new Map(),\n  elementsRef: {\n    current: []\n  }\n});\n/**\n * Provides context for a list of items within the floating element.\n * @see https://floating-ui.com/docs/FloatingList\n */\nfunction FloatingList(props) {\n  const {\n    children,\n    elementsRef,\n    labelsRef\n  } = props;\n  const [map, setMap] = React.useState(() => new Map());\n  const register = React.useCallback(node => {\n    setMap(prevMap => new Map(prevMap).set(node, null));\n  }, []);\n  const unregister = React.useCallback(node => {\n    setMap(prevMap => {\n      const map = new Map(prevMap);\n      map.delete(node);\n      return map;\n    });\n  }, []);\n  index(() => {\n    const newMap = new Map(map);\n    const nodes = Array.from(newMap.keys()).sort(sortByDocumentPosition);\n    nodes.forEach((node, index) => {\n      newMap.set(node, index);\n    });\n    if (!areMapsEqual(map, newMap)) {\n      setMap(newMap);\n    }\n  }, [map]);\n  return /*#__PURE__*/React.createElement(FloatingListContext.Provider, {\n    value: React.useMemo(() => ({\n      register,\n      unregister,\n      map,\n      elementsRef,\n      labelsRef\n    }), [register, unregister, map, elementsRef, labelsRef])\n  }, children);\n}\n/**\n * Used to register a list item and its index (DOM position) in the\n * `FloatingList`.\n * @see https://floating-ui.com/docs/FloatingList#uselistitem\n */\nfunction useListItem(props) {\n  if (props === void 0) {\n    props = {};\n  }\n  const {\n    label\n  } = props;\n  const {\n    register,\n    unregister,\n    map,\n    elementsRef,\n    labelsRef\n  } = React.useContext(FloatingListContext);\n  const [index$1, setIndex] = React.useState(null);\n  const componentRef = React.useRef(null);\n  const ref = React.useCallback(node => {\n    componentRef.current = node;\n    if (index$1 !== null) {\n      elementsRef.current[index$1] = node;\n      if (labelsRef) {\n        var _node$textContent;\n        const isLabelDefined = label !== undefined;\n        labelsRef.current[index$1] = isLabelDefined ? label : (_node$textContent = node == null ? void 0 : node.textContent) != null ? _node$textContent : null;\n      }\n    }\n  }, [index$1, elementsRef, labelsRef, label]);\n  index(() => {\n    const node = componentRef.current;\n    if (node) {\n      register(node);\n      return () => {\n        unregister(node);\n      };\n    }\n  }, [register, unregister]);\n  index(() => {\n    const index = componentRef.current ? map.get(componentRef.current) : null;\n    if (index != null) {\n      setIndex(index);\n    }\n  }, [map]);\n  return React.useMemo(() => ({\n    ref,\n    index: index$1 == null ? -1 : index$1\n  }), [index$1, ref]);\n}\n\nfunction renderJsx(render, computedProps) {\n  if (typeof render === 'function') {\n    return render(computedProps);\n  }\n  if (render) {\n    return /*#__PURE__*/React.cloneElement(render, computedProps);\n  }\n  return /*#__PURE__*/React.createElement(\"div\", computedProps);\n}\nconst CompositeContext = /*#__PURE__*/React.createContext({\n  activeIndex: 0,\n  onNavigate: () => {}\n});\nconst horizontalKeys = [ARROW_LEFT, ARROW_RIGHT];\nconst verticalKeys = [ARROW_UP, ARROW_DOWN];\nconst allKeys = [...horizontalKeys, ...verticalKeys];\n\n/**\n * Creates a single tab stop whose items are navigated by arrow keys, which\n * provides list navigation outside of floating element contexts.\n *\n * This is useful to enable navigation of a list of items that aren’t part of a\n * floating element. A menubar is an example of a composite, with each reference\n * element being an item.\n * @see https://floating-ui.com/docs/Composite\n */\nconst Composite = /*#__PURE__*/React.forwardRef(function Composite(props, forwardedRef) {\n  const {\n    render,\n    orientation = 'both',\n    loop = true,\n    cols = 1,\n    disabledIndices,\n    activeIndex: externalActiveIndex,\n    onNavigate: externalSetActiveIndex,\n    itemSizes,\n    dense = false,\n    ...domProps\n  } = props;\n  const [internalActiveIndex, internalSetActiveIndex] = React.useState(0);\n  const activeIndex = externalActiveIndex != null ? externalActiveIndex : internalActiveIndex;\n  const onNavigate = useEffectEvent(externalSetActiveIndex != null ? externalSetActiveIndex : internalSetActiveIndex);\n  const elementsRef = React.useRef([]);\n  const renderElementProps = render && typeof render !== 'function' ? render.props : {};\n  const contextValue = React.useMemo(() => ({\n    activeIndex,\n    onNavigate\n  }), [activeIndex, onNavigate]);\n  const isGrid = cols > 1;\n  function handleKeyDown(event) {\n    if (!allKeys.includes(event.key)) return;\n    let nextIndex = activeIndex;\n    const minIndex = getMinIndex(elementsRef, disabledIndices);\n    const maxIndex = getMaxIndex(elementsRef, disabledIndices);\n    if (isGrid) {\n      const sizes = itemSizes || Array.from({\n        length: elementsRef.current.length\n      }, () => ({\n        width: 1,\n        height: 1\n      }));\n      // To calculate movements on the grid, we use hypothetical cell indices\n      // as if every item was 1x1, then convert back to real indices.\n      const cellMap = buildCellMap(sizes, cols, dense);\n      const minGridIndex = cellMap.findIndex(index => index != null && !isDisabled(elementsRef.current, index, disabledIndices));\n      // last enabled index\n      const maxGridIndex = cellMap.reduce((foundIndex, index, cellIndex) => index != null && !isDisabled(elementsRef.current, index, disabledIndices) ? cellIndex : foundIndex, -1);\n      nextIndex = cellMap[getGridNavigatedIndex({\n        current: cellMap.map(itemIndex => itemIndex ? elementsRef.current[itemIndex] : null)\n      }, {\n        event,\n        orientation,\n        loop,\n        cols,\n        // treat undefined (empty grid spaces) as disabled indices so we\n        // don't end up in them\n        disabledIndices: getCellIndices([...(disabledIndices || elementsRef.current.map((_, index) => isDisabled(elementsRef.current, index) ? index : undefined)), undefined], cellMap),\n        minIndex: minGridIndex,\n        maxIndex: maxGridIndex,\n        prevIndex: getCellIndexOfCorner(activeIndex > maxIndex ? minIndex : activeIndex, sizes, cellMap, cols,\n        // use a corner matching the edge closest to the direction we're\n        // moving in so we don't end up in the same item. Prefer\n        // top/left over bottom/right.\n        event.key === ARROW_DOWN ? 'bl' : event.key === ARROW_RIGHT ? 'tr' : 'tl')\n      })]; // navigated cell will never be nullish\n    }\n    const toEndKeys = {\n      horizontal: [ARROW_RIGHT],\n      vertical: [ARROW_DOWN],\n      both: [ARROW_RIGHT, ARROW_DOWN]\n    }[orientation];\n    const toStartKeys = {\n      horizontal: [ARROW_LEFT],\n      vertical: [ARROW_UP],\n      both: [ARROW_LEFT, ARROW_UP]\n    }[orientation];\n    const preventedKeys = isGrid ? allKeys : {\n      horizontal: horizontalKeys,\n      vertical: verticalKeys,\n      both: allKeys\n    }[orientation];\n    if (nextIndex === activeIndex && [...toEndKeys, ...toStartKeys].includes(event.key)) {\n      if (loop && nextIndex === maxIndex && toEndKeys.includes(event.key)) {\n        nextIndex = minIndex;\n      } else if (loop && nextIndex === minIndex && toStartKeys.includes(event.key)) {\n        nextIndex = maxIndex;\n      } else {\n        nextIndex = findNonDisabledIndex(elementsRef, {\n          startingIndex: nextIndex,\n          decrement: toStartKeys.includes(event.key),\n          disabledIndices\n        });\n      }\n    }\n    if (nextIndex !== activeIndex && !isIndexOutOfBounds(elementsRef, nextIndex)) {\n      event.stopPropagation();\n      if (preventedKeys.includes(event.key)) {\n        event.preventDefault();\n      }\n      onNavigate(nextIndex);\n\n      // Wait for FocusManager `returnFocus` to execute.\n      queueMicrotask(() => {\n        enqueueFocus(elementsRef.current[nextIndex]);\n      });\n    }\n  }\n  const computedProps = {\n    ...domProps,\n    ...renderElementProps,\n    ref: forwardedRef,\n    'aria-orientation': orientation === 'both' ? undefined : orientation,\n    onKeyDown(e) {\n      domProps.onKeyDown == null || domProps.onKeyDown(e);\n      renderElementProps.onKeyDown == null || renderElementProps.onKeyDown(e);\n      handleKeyDown(e);\n    }\n  };\n  return /*#__PURE__*/React.createElement(CompositeContext.Provider, {\n    value: contextValue\n  }, /*#__PURE__*/React.createElement(FloatingList, {\n    elementsRef: elementsRef\n  }, renderJsx(render, computedProps)));\n});\n/**\n * @see https://floating-ui.com/docs/Composite\n */\nconst CompositeItem = /*#__PURE__*/React.forwardRef(function CompositeItem(props, forwardedRef) {\n  const {\n    render,\n    ...domProps\n  } = props;\n  const renderElementProps = render && typeof render !== 'function' ? render.props : {};\n  const {\n    activeIndex,\n    onNavigate\n  } = React.useContext(CompositeContext);\n  const {\n    ref,\n    index\n  } = useListItem();\n  const mergedRef = useMergeRefs([ref, forwardedRef, renderElementProps.ref]);\n  const isActive = activeIndex === index;\n  const computedProps = {\n    ...domProps,\n    ...renderElementProps,\n    ref: mergedRef,\n    tabIndex: isActive ? 0 : -1,\n    'data-active': isActive ? '' : undefined,\n    onFocus(e) {\n      domProps.onFocus == null || domProps.onFocus(e);\n      renderElementProps.onFocus == null || renderElementProps.onFocus(e);\n      onNavigate(index);\n    }\n  };\n  return renderJsx(render, computedProps);\n});\n\nfunction _extends() {\n  _extends = Object.assign ? Object.assign.bind() : function (target) {\n    for (var i = 1; i < arguments.length; i++) {\n      var source = arguments[i];\n      for (var key in source) {\n        if (Object.prototype.hasOwnProperty.call(source, key)) {\n          target[key] = source[key];\n        }\n      }\n    }\n    return target;\n  };\n  return _extends.apply(this, arguments);\n}\n\nlet serverHandoffComplete = false;\nlet count = 0;\nconst genId = () => // Ensure the id is unique with multiple independent versions of Floating UI\n// on <React 18\n\"floating-ui-\" + Math.random().toString(36).slice(2, 6) + count++;\nfunction useFloatingId() {\n  const [id, setId] = React.useState(() => serverHandoffComplete ? genId() : undefined);\n  index(() => {\n    if (id == null) {\n      setId(genId());\n    }\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, []);\n  React.useEffect(() => {\n    serverHandoffComplete = true;\n  }, []);\n  return id;\n}\nconst useReactId = SafeReact.useId;\n\n/**\n * Uses React 18's built-in `useId()` when available, or falls back to a\n * slightly less performant (requiring a double render) implementation for\n * earlier React versions.\n * @see https://floating-ui.com/docs/react-utils#useid\n */\nconst useId = useReactId || useFloatingId;\n\nlet devMessageSet;\nif (process.env.NODE_ENV !== \"production\") {\n  devMessageSet = /*#__PURE__*/new Set();\n}\nfunction warn() {\n  var _devMessageSet;\n  for (var _len = arguments.length, messages = new Array(_len), _key = 0; _key < _len; _key++) {\n    messages[_key] = arguments[_key];\n  }\n  const message = \"Floating UI: \" + messages.join(' ');\n  if (!((_devMessageSet = devMessageSet) != null && _devMessageSet.has(message))) {\n    var _devMessageSet2;\n    (_devMessageSet2 = devMessageSet) == null || _devMessageSet2.add(message);\n    console.warn(message);\n  }\n}\nfunction error() {\n  var _devMessageSet3;\n  for (var _len2 = arguments.length, messages = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n    messages[_key2] = arguments[_key2];\n  }\n  const message = \"Floating UI: \" + messages.join(' ');\n  if (!((_devMessageSet3 = devMessageSet) != null && _devMessageSet3.has(message))) {\n    var _devMessageSet4;\n    (_devMessageSet4 = devMessageSet) == null || _devMessageSet4.add(message);\n    console.error(message);\n  }\n}\n\n/**\n * Renders a pointing arrow triangle.\n * @see https://floating-ui.com/docs/FloatingArrow\n */\nconst FloatingArrow = /*#__PURE__*/React.forwardRef(function FloatingArrow(props, ref) {\n  const {\n    context: {\n      placement,\n      elements: {\n        floating\n      },\n      middlewareData: {\n        arrow\n      }\n    },\n    width = 14,\n    height = 7,\n    tipRadius = 0,\n    strokeWidth = 0,\n    staticOffset,\n    stroke,\n    d,\n    style: {\n      transform,\n      ...restStyle\n    } = {},\n    ...rest\n  } = props;\n  if (process.env.NODE_ENV !== \"production\") {\n    if (!ref) {\n      warn('The `ref` prop is required for `FloatingArrow`.');\n    }\n  }\n  const clipPathId = useId();\n  if (!floating) {\n    return null;\n  }\n\n  // Strokes must be double the border width, this ensures the stroke's width\n  // works as you'd expect.\n  const computedStrokeWidth = strokeWidth * 2;\n  const halfStrokeWidth = computedStrokeWidth / 2;\n  const svgX = width / 2 * (tipRadius / -8 + 1);\n  const svgY = height / 2 * tipRadius / 4;\n  const [side, alignment] = placement.split('-');\n  const isRTL = platform.isRTL(floating);\n  const isCustomShape = !!d;\n  const isVerticalSide = side === 'top' || side === 'bottom';\n  const yOffsetProp = staticOffset && alignment === 'end' ? 'bottom' : 'top';\n  let xOffsetProp = staticOffset && alignment === 'end' ? 'right' : 'left';\n  if (staticOffset && isRTL) {\n    xOffsetProp = alignment === 'end' ? 'left' : 'right';\n  }\n  const arrowX = (arrow == null ? void 0 : arrow.x) != null ? staticOffset || arrow.x : '';\n  const arrowY = (arrow == null ? void 0 : arrow.y) != null ? staticOffset || arrow.y : '';\n  const dValue = d || 'M0,0' + (\" H\" + width) + (\" L\" + (width - svgX) + \",\" + (height - svgY)) + (\" Q\" + width / 2 + \",\" + height + \" \" + svgX + \",\" + (height - svgY)) + ' Z';\n  const rotation = {\n    top: isCustomShape ? 'rotate(180deg)' : '',\n    left: isCustomShape ? 'rotate(90deg)' : 'rotate(-90deg)',\n    bottom: isCustomShape ? '' : 'rotate(180deg)',\n    right: isCustomShape ? 'rotate(-90deg)' : 'rotate(90deg)'\n  }[side];\n  return /*#__PURE__*/React.createElement(\"svg\", _extends({}, rest, {\n    \"aria-hidden\": true,\n    ref: ref,\n    width: isCustomShape ? width : width + computedStrokeWidth,\n    height: width,\n    viewBox: \"0 0 \" + width + \" \" + (height > width ? height : width),\n    style: {\n      position: 'absolute',\n      pointerEvents: 'none',\n      [xOffsetProp]: arrowX,\n      [yOffsetProp]: arrowY,\n      [side]: isVerticalSide || isCustomShape ? '100%' : \"calc(100% - \" + computedStrokeWidth / 2 + \"px)\",\n      transform: \"\" + rotation + (transform != null ? transform : ''),\n      ...restStyle\n    }\n  }), computedStrokeWidth > 0 && /*#__PURE__*/React.createElement(\"path\", {\n    clipPath: \"url(#\" + clipPathId + \")\",\n    fill: \"none\",\n    stroke: stroke\n    // Account for the stroke on the fill path rendered below.\n    ,\n    strokeWidth: computedStrokeWidth + (d ? 0 : 1),\n    d: dValue\n  }), /*#__PURE__*/React.createElement(\"path\", {\n    stroke: computedStrokeWidth && !d ? rest.fill : 'none',\n    d: dValue\n  }), /*#__PURE__*/React.createElement(\"clipPath\", {\n    id: clipPathId\n  }, /*#__PURE__*/React.createElement(\"rect\", {\n    x: -halfStrokeWidth,\n    y: halfStrokeWidth * (isCustomShape ? -1 : 1),\n    width: width + computedStrokeWidth,\n    height: width\n  })));\n});\n\nfunction createPubSub() {\n  const map = new Map();\n  return {\n    emit(event, data) {\n      var _map$get;\n      (_map$get = map.get(event)) == null || _map$get.forEach(handler => handler(data));\n    },\n    on(event, listener) {\n      map.set(event, [...(map.get(event) || []), listener]);\n    },\n    off(event, listener) {\n      var _map$get2;\n      map.set(event, ((_map$get2 = map.get(event)) == null ? void 0 : _map$get2.filter(l => l !== listener)) || []);\n    }\n  };\n}\n\nconst FloatingNodeContext = /*#__PURE__*/React.createContext(null);\nconst FloatingTreeContext = /*#__PURE__*/React.createContext(null);\n\n/**\n * Returns the parent node id for nested floating elements, if available.\n * Returns `null` for top-level floating elements.\n */\nconst useFloatingParentNodeId = () => {\n  var _React$useContext;\n  return ((_React$useContext = React.useContext(FloatingNodeContext)) == null ? void 0 : _React$useContext.id) || null;\n};\n\n/**\n * Returns the nearest floating tree context, if available.\n */\nconst useFloatingTree = () => React.useContext(FloatingTreeContext);\n\n/**\n * Registers a node into the `FloatingTree`, returning its id.\n * @see https://floating-ui.com/docs/FloatingTree\n */\nfunction useFloatingNodeId(customParentId) {\n  const id = useId();\n  const tree = useFloatingTree();\n  const reactParentId = useFloatingParentNodeId();\n  const parentId = customParentId || reactParentId;\n  index(() => {\n    const node = {\n      id,\n      parentId\n    };\n    tree == null || tree.addNode(node);\n    return () => {\n      tree == null || tree.removeNode(node);\n    };\n  }, [tree, id, parentId]);\n  return id;\n}\n\n/**\n * Provides parent node context for nested floating elements.\n * @see https://floating-ui.com/docs/FloatingTree\n */\nfunction FloatingNode(props) {\n  const {\n    children,\n    id\n  } = props;\n  const parentId = useFloatingParentNodeId();\n  return /*#__PURE__*/React.createElement(FloatingNodeContext.Provider, {\n    value: React.useMemo(() => ({\n      id,\n      parentId\n    }), [id, parentId])\n  }, children);\n}\n\n/**\n * Provides context for nested floating elements when they are not children of\n * each other on the DOM.\n * This is not necessary in all cases, except when there must be explicit communication between parent and child floating elements. It is necessary for:\n * - The `bubbles` option in the `useDismiss()` Hook\n * - Nested virtual list navigation\n * - Nested floating elements that each open on hover\n * - Custom communication between parent and child floating elements\n * @see https://floating-ui.com/docs/FloatingTree\n */\nfunction FloatingTree(props) {\n  const {\n    children\n  } = props;\n  const nodesRef = React.useRef([]);\n  const addNode = React.useCallback(node => {\n    nodesRef.current = [...nodesRef.current, node];\n  }, []);\n  const removeNode = React.useCallback(node => {\n    nodesRef.current = nodesRef.current.filter(n => n !== node);\n  }, []);\n  const events = React.useState(() => createPubSub())[0];\n  return /*#__PURE__*/React.createElement(FloatingTreeContext.Provider, {\n    value: React.useMemo(() => ({\n      nodesRef,\n      addNode,\n      removeNode,\n      events\n    }), [addNode, removeNode, events])\n  }, children);\n}\n\nfunction createAttribute(name) {\n  return \"data-floating-ui-\" + name;\n}\n\nfunction useLatestRef(value) {\n  const ref = useRef(value);\n  index(() => {\n    ref.current = value;\n  });\n  return ref;\n}\n\nconst safePolygonIdentifier = /*#__PURE__*/createAttribute('safe-polygon');\nfunction getDelay(value, prop, pointerType) {\n  if (pointerType && !isMouseLikePointerType(pointerType)) {\n    return 0;\n  }\n  if (typeof value === 'number') {\n    return value;\n  }\n  return value == null ? void 0 : value[prop];\n}\n/**\n * Opens the floating element while hovering over the reference element, like\n * CSS `:hover`.\n * @see https://floating-ui.com/docs/useHover\n */\nfunction useHover(context, props) {\n  if (props === void 0) {\n    props = {};\n  }\n  const {\n    open,\n    onOpenChange,\n    dataRef,\n    events,\n    elements: {\n      domReference,\n      floating\n    }\n  } = context;\n  const {\n    enabled = true,\n    delay = 0,\n    handleClose = null,\n    mouseOnly = false,\n    restMs = 0,\n    move = true\n  } = props;\n  const tree = useFloatingTree();\n  const parentId = useFloatingParentNodeId();\n  const handleCloseRef = useLatestRef(handleClose);\n  const delayRef = useLatestRef(delay);\n  const pointerTypeRef = React.useRef();\n  const timeoutRef = React.useRef(-1);\n  const handlerRef = React.useRef();\n  const restTimeoutRef = React.useRef(-1);\n  const blockMouseMoveRef = React.useRef(true);\n  const performedPointerEventsMutationRef = React.useRef(false);\n  const unbindMouseMoveRef = React.useRef(() => {});\n  const isHoverOpen = React.useCallback(() => {\n    var _dataRef$current$open;\n    const type = (_dataRef$current$open = dataRef.current.openEvent) == null ? void 0 : _dataRef$current$open.type;\n    return (type == null ? void 0 : type.includes('mouse')) && type !== 'mousedown';\n  }, [dataRef]);\n\n  // When closing before opening, clear the delay timeouts to cancel it\n  // from showing.\n  React.useEffect(() => {\n    if (!enabled) {\n      return;\n    }\n    function onOpenChange(_ref) {\n      let {\n        open\n      } = _ref;\n      if (!open) {\n        clearTimeout(timeoutRef.current);\n        clearTimeout(restTimeoutRef.current);\n        blockMouseMoveRef.current = true;\n      }\n    }\n    events.on('openchange', onOpenChange);\n    return () => {\n      events.off('openchange', onOpenChange);\n    };\n  }, [enabled, events]);\n  React.useEffect(() => {\n    if (!enabled || !handleCloseRef.current || !open) {\n      return;\n    }\n    function onLeave(event) {\n      if (isHoverOpen()) {\n        onOpenChange(false, event, 'hover');\n      }\n    }\n    const html = getDocument(floating).documentElement;\n    html.addEventListener('mouseleave', onLeave);\n    return () => {\n      html.removeEventListener('mouseleave', onLeave);\n    };\n  }, [floating, open, onOpenChange, enabled, handleCloseRef, isHoverOpen]);\n  const closeWithDelay = React.useCallback(function (event, runElseBranch, reason) {\n    if (runElseBranch === void 0) {\n      runElseBranch = true;\n    }\n    if (reason === void 0) {\n      reason = 'hover';\n    }\n    const closeDelay = getDelay(delayRef.current, 'close', pointerTypeRef.current);\n    if (closeDelay && !handlerRef.current) {\n      clearTimeout(timeoutRef.current);\n      timeoutRef.current = window.setTimeout(() => onOpenChange(false, event, reason), closeDelay);\n    } else if (runElseBranch) {\n      clearTimeout(timeoutRef.current);\n      onOpenChange(false, event, reason);\n    }\n  }, [delayRef, onOpenChange]);\n  const cleanupMouseMoveHandler = useEffectEvent(() => {\n    unbindMouseMoveRef.current();\n    handlerRef.current = undefined;\n  });\n  const clearPointerEvents = useEffectEvent(() => {\n    if (performedPointerEventsMutationRef.current) {\n      const body = getDocument(floating).body;\n      body.style.pointerEvents = '';\n      body.removeAttribute(safePolygonIdentifier);\n      performedPointerEventsMutationRef.current = false;\n    }\n  });\n\n  // Registering the mouse events on the reference directly to bypass React's\n  // delegation system. If the cursor was on a disabled element and then entered\n  // the reference (no gap), `mouseenter` doesn't fire in the delegation system.\n  React.useEffect(() => {\n    if (!enabled) {\n      return;\n    }\n    function isClickLikeOpenEvent() {\n      return dataRef.current.openEvent ? ['click', 'mousedown'].includes(dataRef.current.openEvent.type) : false;\n    }\n    function onMouseEnter(event) {\n      clearTimeout(timeoutRef.current);\n      blockMouseMoveRef.current = false;\n      if (mouseOnly && !isMouseLikePointerType(pointerTypeRef.current) || restMs > 0 && !getDelay(delayRef.current, 'open')) {\n        return;\n      }\n      const openDelay = getDelay(delayRef.current, 'open', pointerTypeRef.current);\n      if (openDelay) {\n        timeoutRef.current = window.setTimeout(() => {\n          onOpenChange(true, event, 'hover');\n        }, openDelay);\n      } else {\n        onOpenChange(true, event, 'hover');\n      }\n    }\n    function onMouseLeave(event) {\n      if (isClickLikeOpenEvent()) return;\n      unbindMouseMoveRef.current();\n      const doc = getDocument(floating);\n      clearTimeout(restTimeoutRef.current);\n      if (handleCloseRef.current && dataRef.current.floatingContext) {\n        // Prevent clearing `onScrollMouseLeave` timeout.\n        if (!open) {\n          clearTimeout(timeoutRef.current);\n        }\n        handlerRef.current = handleCloseRef.current({\n          ...dataRef.current.floatingContext,\n          tree,\n          x: event.clientX,\n          y: event.clientY,\n          onClose() {\n            clearPointerEvents();\n            cleanupMouseMoveHandler();\n            closeWithDelay(event, true, 'safe-polygon');\n          }\n        });\n        const handler = handlerRef.current;\n        doc.addEventListener('mousemove', handler);\n        unbindMouseMoveRef.current = () => {\n          doc.removeEventListener('mousemove', handler);\n        };\n        return;\n      }\n\n      // Allow interactivity without `safePolygon` on touch devices. With a\n      // pointer, a short close delay is an alternative, so it should work\n      // consistently.\n      const shouldClose = pointerTypeRef.current === 'touch' ? !contains(floating, event.relatedTarget) : true;\n      if (shouldClose) {\n        closeWithDelay(event);\n      }\n    }\n\n    // Ensure the floating element closes after scrolling even if the pointer\n    // did not move.\n    // https://github.com/floating-ui/floating-ui/discussions/1692\n    function onScrollMouseLeave(event) {\n      if (isClickLikeOpenEvent()) return;\n      if (!dataRef.current.floatingContext) return;\n      handleCloseRef.current == null || handleCloseRef.current({\n        ...dataRef.current.floatingContext,\n        tree,\n        x: event.clientX,\n        y: event.clientY,\n        onClose() {\n          clearPointerEvents();\n          cleanupMouseMoveHandler();\n          closeWithDelay(event);\n        }\n      })(event);\n    }\n    if (isElement(domReference)) {\n      const ref = domReference;\n      open && ref.addEventListener('mouseleave', onScrollMouseLeave);\n      floating == null || floating.addEventListener('mouseleave', onScrollMouseLeave);\n      move && ref.addEventListener('mousemove', onMouseEnter, {\n        once: true\n      });\n      ref.addEventListener('mouseenter', onMouseEnter);\n      ref.addEventListener('mouseleave', onMouseLeave);\n      return () => {\n        open && ref.removeEventListener('mouseleave', onScrollMouseLeave);\n        floating == null || floating.removeEventListener('mouseleave', onScrollMouseLeave);\n        move && ref.removeEventListener('mousemove', onMouseEnter);\n        ref.removeEventListener('mouseenter', onMouseEnter);\n        ref.removeEventListener('mouseleave', onMouseLeave);\n      };\n    }\n  }, [domReference, floating, enabled, context, mouseOnly, restMs, move, closeWithDelay, cleanupMouseMoveHandler, clearPointerEvents, onOpenChange, open, tree, delayRef, handleCloseRef, dataRef]);\n\n  // Block pointer-events of every element other than the reference and floating\n  // while the floating element is open and has a `handleClose` handler. Also\n  // handles nested floating elements.\n  // https://github.com/floating-ui/floating-ui/issues/1722\n  index(() => {\n    var _handleCloseRef$curre;\n    if (!enabled) {\n      return;\n    }\n    if (open && (_handleCloseRef$curre = handleCloseRef.current) != null && _handleCloseRef$curre.__options.blockPointerEvents && isHoverOpen()) {\n      const body = getDocument(floating).body;\n      body.setAttribute(safePolygonIdentifier, '');\n      body.style.pointerEvents = 'none';\n      performedPointerEventsMutationRef.current = true;\n      if (isElement(domReference) && floating) {\n        var _tree$nodesRef$curren;\n        const ref = domReference;\n        const parentFloating = tree == null || (_tree$nodesRef$curren = tree.nodesRef.current.find(node => node.id === parentId)) == null || (_tree$nodesRef$curren = _tree$nodesRef$curren.context) == null ? void 0 : _tree$nodesRef$curren.elements.floating;\n        if (parentFloating) {\n          parentFloating.style.pointerEvents = '';\n        }\n        ref.style.pointerEvents = 'auto';\n        floating.style.pointerEvents = 'auto';\n        return () => {\n          ref.style.pointerEvents = '';\n          floating.style.pointerEvents = '';\n        };\n      }\n    }\n  }, [enabled, open, parentId, floating, domReference, tree, handleCloseRef, isHoverOpen]);\n  index(() => {\n    if (!open) {\n      pointerTypeRef.current = undefined;\n      cleanupMouseMoveHandler();\n      clearPointerEvents();\n    }\n  }, [open, cleanupMouseMoveHandler, clearPointerEvents]);\n  React.useEffect(() => {\n    return () => {\n      cleanupMouseMoveHandler();\n      clearTimeout(timeoutRef.current);\n      clearTimeout(restTimeoutRef.current);\n      clearPointerEvents();\n    };\n  }, [enabled, domReference, cleanupMouseMoveHandler, clearPointerEvents]);\n  return React.useMemo(() => {\n    if (!enabled) {\n      return {};\n    }\n    function setPointerRef(event) {\n      pointerTypeRef.current = event.pointerType;\n    }\n    return {\n      reference: {\n        onPointerDown: setPointerRef,\n        onPointerEnter: setPointerRef,\n        onMouseMove(event) {\n          function handleMouseMove() {\n            if (!blockMouseMoveRef.current) {\n              onOpenChange(true, event.nativeEvent, 'hover');\n            }\n          }\n          if (mouseOnly && !isMouseLikePointerType(pointerTypeRef.current)) {\n            return;\n          }\n          if (open || restMs === 0) {\n            return;\n          }\n          clearTimeout(restTimeoutRef.current);\n          if (pointerTypeRef.current === 'touch') {\n            handleMouseMove();\n          } else {\n            restTimeoutRef.current = window.setTimeout(handleMouseMove, restMs);\n          }\n        }\n      },\n      floating: {\n        onMouseEnter() {\n          clearTimeout(timeoutRef.current);\n        },\n        onMouseLeave(event) {\n          closeWithDelay(event.nativeEvent, false);\n        }\n      }\n    };\n  }, [enabled, mouseOnly, open, restMs, onOpenChange, closeWithDelay]);\n}\n\nconst NOOP = () => {};\nconst FloatingDelayGroupContext = /*#__PURE__*/React.createContext({\n  delay: 0,\n  initialDelay: 0,\n  timeoutMs: 0,\n  currentId: null,\n  setCurrentId: NOOP,\n  setState: NOOP,\n  isInstantPhase: false\n});\n\n/**\n * @deprecated\n * Use the return value of `useDelayGroup()` instead.\n */\nconst useDelayGroupContext = () => React.useContext(FloatingDelayGroupContext);\n/**\n * Provides context for a group of floating elements that should share a\n * `delay`.\n * @see https://floating-ui.com/docs/FloatingDelayGroup\n */\nfunction FloatingDelayGroup(props) {\n  const {\n    children,\n    delay,\n    timeoutMs = 0\n  } = props;\n  const [state, setState] = React.useReducer((prev, next) => ({\n    ...prev,\n    ...next\n  }), {\n    delay,\n    timeoutMs,\n    initialDelay: delay,\n    currentId: null,\n    isInstantPhase: false\n  });\n  const initialCurrentIdRef = React.useRef(null);\n  const setCurrentId = React.useCallback(currentId => {\n    setState({\n      currentId\n    });\n  }, []);\n  index(() => {\n    if (state.currentId) {\n      if (initialCurrentIdRef.current === null) {\n        initialCurrentIdRef.current = state.currentId;\n      } else if (!state.isInstantPhase) {\n        setState({\n          isInstantPhase: true\n        });\n      }\n    } else {\n      if (state.isInstantPhase) {\n        setState({\n          isInstantPhase: false\n        });\n      }\n      initialCurrentIdRef.current = null;\n    }\n  }, [state.currentId, state.isInstantPhase]);\n  return /*#__PURE__*/React.createElement(FloatingDelayGroupContext.Provider, {\n    value: React.useMemo(() => ({\n      ...state,\n      setState,\n      setCurrentId\n    }), [state, setCurrentId])\n  }, children);\n}\n/**\n * Enables grouping when called inside a component that's a child of a\n * `FloatingDelayGroup`.\n * @see https://floating-ui.com/docs/FloatingDelayGroup\n */\nfunction useDelayGroup(context, options) {\n  if (options === void 0) {\n    options = {};\n  }\n  const {\n    open,\n    onOpenChange,\n    floatingId\n  } = context;\n  const {\n    id: optionId\n  } = options;\n  const id = optionId != null ? optionId : floatingId;\n  const groupContext = useDelayGroupContext();\n  const {\n    currentId,\n    setCurrentId,\n    initialDelay,\n    setState,\n    timeoutMs\n  } = groupContext;\n  index(() => {\n    if (!currentId) return;\n    setState({\n      delay: {\n        open: 1,\n        close: getDelay(initialDelay, 'close')\n      }\n    });\n    if (currentId !== id) {\n      onOpenChange(false);\n    }\n  }, [id, onOpenChange, setState, currentId, initialDelay]);\n  index(() => {\n    function unset() {\n      onOpenChange(false);\n      setState({\n        delay: initialDelay,\n        currentId: null\n      });\n    }\n    if (!currentId) return;\n    if (!open && currentId === id) {\n      if (timeoutMs) {\n        const timeout = window.setTimeout(unset, timeoutMs);\n        return () => {\n          clearTimeout(timeout);\n        };\n      }\n      unset();\n    }\n  }, [open, setState, currentId, id, onOpenChange, initialDelay, timeoutMs]);\n  index(() => {\n    if (setCurrentId === NOOP || !open) return;\n    setCurrentId(id);\n  }, [open, setCurrentId, id]);\n  return groupContext;\n}\n\nfunction getAncestors(nodes, id) {\n  var _nodes$find;\n  let allAncestors = [];\n  let currentParentId = (_nodes$find = nodes.find(node => node.id === id)) == null ? void 0 : _nodes$find.parentId;\n  while (currentParentId) {\n    const currentNode = nodes.find(node => node.id === currentParentId);\n    currentParentId = currentNode == null ? void 0 : currentNode.parentId;\n    if (currentNode) {\n      allAncestors = allAncestors.concat(currentNode);\n    }\n  }\n  return allAncestors;\n}\n\nfunction getChildren(nodes, id) {\n  let allChildren = nodes.filter(node => {\n    var _node$context;\n    return node.parentId === id && ((_node$context = node.context) == null ? void 0 : _node$context.open);\n  });\n  let currentChildren = allChildren;\n  while (currentChildren.length) {\n    currentChildren = nodes.filter(node => {\n      var _currentChildren;\n      return (_currentChildren = currentChildren) == null ? void 0 : _currentChildren.some(n => {\n        var _node$context2;\n        return node.parentId === n.id && ((_node$context2 = node.context) == null ? void 0 : _node$context2.open);\n      });\n    });\n    allChildren = allChildren.concat(currentChildren);\n  }\n  return allChildren;\n}\nfunction getDeepestNode(nodes, id) {\n  let deepestNodeId;\n  let maxDepth = -1;\n  function findDeepest(nodeId, depth) {\n    if (depth > maxDepth) {\n      deepestNodeId = nodeId;\n      maxDepth = depth;\n    }\n    const children = getChildren(nodes, nodeId);\n    children.forEach(child => {\n      findDeepest(child.id, depth + 1);\n    });\n  }\n  findDeepest(id, 0);\n  return nodes.find(node => node.id === deepestNodeId);\n}\n\n// Modified to add conditional `aria-hidden` support:\n// https://github.com/theKashey/aria-hidden/blob/9220c8f4a4fd35f63bee5510a9f41a37264382d4/src/index.ts\nlet counterMap = /*#__PURE__*/new WeakMap();\nlet uncontrolledElementsSet = /*#__PURE__*/new WeakSet();\nlet markerMap = {};\nlet lockCount = 0;\nconst supportsInert = () => typeof HTMLElement !== 'undefined' && 'inert' in HTMLElement.prototype;\nconst unwrapHost = node => node && (node.host || unwrapHost(node.parentNode));\nconst correctElements = (parent, targets) => targets.map(target => {\n  if (parent.contains(target)) {\n    return target;\n  }\n  const correctedTarget = unwrapHost(target);\n  if (parent.contains(correctedTarget)) {\n    return correctedTarget;\n  }\n  return null;\n}).filter(x => x != null);\nfunction applyAttributeToOthers(uncorrectedAvoidElements, body, ariaHidden, inert) {\n  const markerName = 'data-floating-ui-inert';\n  const controlAttribute = inert ? 'inert' : ariaHidden ? 'aria-hidden' : null;\n  const avoidElements = correctElements(body, uncorrectedAvoidElements);\n  const elementsToKeep = new Set();\n  const elementsToStop = new Set(avoidElements);\n  const hiddenElements = [];\n  if (!markerMap[markerName]) {\n    markerMap[markerName] = new WeakMap();\n  }\n  const markerCounter = markerMap[markerName];\n  avoidElements.forEach(keep);\n  deep(body);\n  elementsToKeep.clear();\n  function keep(el) {\n    if (!el || elementsToKeep.has(el)) {\n      return;\n    }\n    elementsToKeep.add(el);\n    el.parentNode && keep(el.parentNode);\n  }\n  function deep(parent) {\n    if (!parent || elementsToStop.has(parent)) {\n      return;\n    }\n    [].forEach.call(parent.children, node => {\n      if (getNodeName(node) === 'script') return;\n      if (elementsToKeep.has(node)) {\n        deep(node);\n      } else {\n        const attr = controlAttribute ? node.getAttribute(controlAttribute) : null;\n        const alreadyHidden = attr !== null && attr !== 'false';\n        const counterValue = (counterMap.get(node) || 0) + 1;\n        const markerValue = (markerCounter.get(node) || 0) + 1;\n        counterMap.set(node, counterValue);\n        markerCounter.set(node, markerValue);\n        hiddenElements.push(node);\n        if (counterValue === 1 && alreadyHidden) {\n          uncontrolledElementsSet.add(node);\n        }\n        if (markerValue === 1) {\n          node.setAttribute(markerName, '');\n        }\n        if (!alreadyHidden && controlAttribute) {\n          node.setAttribute(controlAttribute, 'true');\n        }\n      }\n    });\n  }\n  lockCount++;\n  return () => {\n    hiddenElements.forEach(element => {\n      const counterValue = (counterMap.get(element) || 0) - 1;\n      const markerValue = (markerCounter.get(element) || 0) - 1;\n      counterMap.set(element, counterValue);\n      markerCounter.set(element, markerValue);\n      if (!counterValue) {\n        if (!uncontrolledElementsSet.has(element) && controlAttribute) {\n          element.removeAttribute(controlAttribute);\n        }\n        uncontrolledElementsSet.delete(element);\n      }\n      if (!markerValue) {\n        element.removeAttribute(markerName);\n      }\n    });\n    lockCount--;\n    if (!lockCount) {\n      counterMap = new WeakMap();\n      counterMap = new WeakMap();\n      uncontrolledElementsSet = new WeakSet();\n      markerMap = {};\n    }\n  };\n}\nfunction markOthers(avoidElements, ariaHidden, inert) {\n  if (ariaHidden === void 0) {\n    ariaHidden = false;\n  }\n  if (inert === void 0) {\n    inert = false;\n  }\n  const body = getDocument(avoidElements[0]).body;\n  return applyAttributeToOthers(avoidElements.concat(Array.from(body.querySelectorAll('[aria-live]'))), body, ariaHidden, inert);\n}\n\nconst getTabbableOptions = () => ({\n  getShadowRoot: true,\n  displayCheck:\n  // JSDOM does not support the `tabbable` library. To solve this we can\n  // check if `ResizeObserver` is a real function (not polyfilled), which\n  // determines if the current environment is JSDOM-like.\n  typeof ResizeObserver === 'function' && ResizeObserver.toString().includes('[native code]') ? 'full' : 'none'\n});\nfunction getTabbableIn(container, direction) {\n  const allTabbable = tabbable(container, getTabbableOptions());\n  if (direction === 'prev') {\n    allTabbable.reverse();\n  }\n  const activeIndex = allTabbable.indexOf(activeElement(getDocument(container)));\n  const nextTabbableElements = allTabbable.slice(activeIndex + 1);\n  return nextTabbableElements[0];\n}\nfunction getNextTabbable() {\n  return getTabbableIn(document.body, 'next');\n}\nfunction getPreviousTabbable() {\n  return getTabbableIn(document.body, 'prev');\n}\nfunction isOutsideEvent(event, container) {\n  const containerElement = container || event.currentTarget;\n  const relatedTarget = event.relatedTarget;\n  return !relatedTarget || !contains(containerElement, relatedTarget);\n}\nfunction disableFocusInside(container) {\n  const tabbableElements = tabbable(container, getTabbableOptions());\n  tabbableElements.forEach(element => {\n    element.dataset.tabindex = element.getAttribute('tabindex') || '';\n    element.setAttribute('tabindex', '-1');\n  });\n}\nfunction enableFocusInside(container) {\n  const elements = container.querySelectorAll('[data-tabindex]');\n  elements.forEach(element => {\n    const tabindex = element.dataset.tabindex;\n    delete element.dataset.tabindex;\n    if (tabindex) {\n      element.setAttribute('tabindex', tabindex);\n    } else {\n      element.removeAttribute('tabindex');\n    }\n  });\n}\n\n// See Diego Haz's Sandbox for making this logic work well on Safari/iOS:\n// https://codesandbox.io/s/tabbable-portal-f4tng?file=/src/FocusTrap.tsx\n\nconst HIDDEN_STYLES = {\n  border: 0,\n  clip: 'rect(0 0 0 0)',\n  height: '1px',\n  margin: '-1px',\n  overflow: 'hidden',\n  padding: 0,\n  position: 'fixed',\n  whiteSpace: 'nowrap',\n  width: '1px',\n  top: 0,\n  left: 0\n};\nlet timeoutId;\nfunction setActiveElementOnTab(event) {\n  if (event.key === 'Tab') {\n    event.target;\n    clearTimeout(timeoutId);\n  }\n}\nconst FocusGuard = /*#__PURE__*/React.forwardRef(function FocusGuard(props, ref) {\n  const [role, setRole] = React.useState();\n  index(() => {\n    if (isSafari()) {\n      // Unlike other screen readers such as NVDA and JAWS, the virtual cursor\n      // on VoiceOver does trigger the onFocus event, so we can use the focus\n      // trap element. On Safari, only buttons trigger the onFocus event.\n      // NB: \"group\" role in the Sandbox no longer appears to work, must be a\n      // button role.\n      setRole('button');\n    }\n    document.addEventListener('keydown', setActiveElementOnTab);\n    return () => {\n      document.removeEventListener('keydown', setActiveElementOnTab);\n    };\n  }, []);\n  const restProps = {\n    ref,\n    tabIndex: 0,\n    // Role is only for VoiceOver\n    role,\n    'aria-hidden': role ? undefined : true,\n    [createAttribute('focus-guard')]: '',\n    style: HIDDEN_STYLES\n  };\n  return /*#__PURE__*/React.createElement(\"span\", _extends({}, props, restProps));\n});\n\nconst PortalContext = /*#__PURE__*/React.createContext(null);\nconst attr = /*#__PURE__*/createAttribute('portal');\n\n/**\n * @see https://floating-ui.com/docs/FloatingPortal#usefloatingportalnode\n */\nfunction useFloatingPortalNode(props) {\n  if (props === void 0) {\n    props = {};\n  }\n  const {\n    id,\n    root\n  } = props;\n  const uniqueId = useId();\n  const portalContext = usePortalContext();\n  const [portalNode, setPortalNode] = React.useState(null);\n  const portalNodeRef = React.useRef(null);\n  index(() => {\n    return () => {\n      portalNode == null || portalNode.remove();\n      // Allow the subsequent layout effects to create a new node on updates.\n      // The portal node will still be cleaned up on unmount.\n      // https://github.com/floating-ui/floating-ui/issues/2454\n      queueMicrotask(() => {\n        portalNodeRef.current = null;\n      });\n    };\n  }, [portalNode]);\n  index(() => {\n    // Wait for the uniqueId to be generated before creating the portal node in\n    // React <18 (using `useFloatingId` instead of the native `useId`).\n    // https://github.com/floating-ui/floating-ui/issues/2778\n    if (!uniqueId) return;\n    if (portalNodeRef.current) return;\n    const existingIdRoot = id ? document.getElementById(id) : null;\n    if (!existingIdRoot) return;\n    const subRoot = document.createElement('div');\n    subRoot.id = uniqueId;\n    subRoot.setAttribute(attr, '');\n    existingIdRoot.appendChild(subRoot);\n    portalNodeRef.current = subRoot;\n    setPortalNode(subRoot);\n  }, [id, uniqueId]);\n  index(() => {\n    if (!uniqueId) return;\n    if (portalNodeRef.current) return;\n    let container = root || (portalContext == null ? void 0 : portalContext.portalNode);\n    if (container && !isElement(container)) container = container.current;\n    container = container || document.body;\n    let idWrapper = null;\n    if (id) {\n      idWrapper = document.createElement('div');\n      idWrapper.id = id;\n      container.appendChild(idWrapper);\n    }\n    const subRoot = document.createElement('div');\n    subRoot.id = uniqueId;\n    subRoot.setAttribute(attr, '');\n    container = idWrapper || container;\n    container.appendChild(subRoot);\n    portalNodeRef.current = subRoot;\n    setPortalNode(subRoot);\n  }, [id, root, uniqueId, portalContext]);\n  return portalNode;\n}\n/**\n * Portals the floating element into a given container element — by default,\n * outside of the app root and into the body.\n * This is necessary to ensure the floating element can appear outside any\n * potential parent containers that cause clipping (such as `overflow: hidden`),\n * while retaining its location in the React tree.\n * @see https://floating-ui.com/docs/FloatingPortal\n */\nfunction FloatingPortal(props) {\n  const {\n    children,\n    id,\n    root = null,\n    preserveTabOrder = true\n  } = props;\n  const portalNode = useFloatingPortalNode({\n    id,\n    root\n  });\n  const [focusManagerState, setFocusManagerState] = React.useState(null);\n  const beforeOutsideRef = React.useRef(null);\n  const afterOutsideRef = React.useRef(null);\n  const beforeInsideRef = React.useRef(null);\n  const afterInsideRef = React.useRef(null);\n  const shouldRenderGuards =\n  // The FocusManager and therefore floating element are currently open/\n  // rendered.\n  !!focusManagerState &&\n  // Guards are only for non-modal focus management.\n  !focusManagerState.modal &&\n  // Don't render if unmount is transitioning.\n  focusManagerState.open && preserveTabOrder && !!(root || portalNode);\n\n  // https://codesandbox.io/s/tabbable-portal-f4tng?file=/src/TabbablePortal.tsx\n  React.useEffect(() => {\n    if (!portalNode || !preserveTabOrder || focusManagerState != null && focusManagerState.modal) {\n      return;\n    }\n\n    // Make sure elements inside the portal element are tabbable only when the\n    // portal has already been focused, either by tabbing into a focus trap\n    // element outside or using the mouse.\n    function onFocus(event) {\n      if (portalNode && isOutsideEvent(event)) {\n        const focusing = event.type === 'focusin';\n        const manageFocus = focusing ? enableFocusInside : disableFocusInside;\n        manageFocus(portalNode);\n      }\n    }\n    // Listen to the event on the capture phase so they run before the focus\n    // trap elements onFocus prop is called.\n    portalNode.addEventListener('focusin', onFocus, true);\n    portalNode.addEventListener('focusout', onFocus, true);\n    return () => {\n      portalNode.removeEventListener('focusin', onFocus, true);\n      portalNode.removeEventListener('focusout', onFocus, true);\n    };\n  }, [portalNode, preserveTabOrder, focusManagerState == null ? void 0 : focusManagerState.modal]);\n  return /*#__PURE__*/React.createElement(PortalContext.Provider, {\n    value: React.useMemo(() => ({\n      preserveTabOrder,\n      beforeOutsideRef,\n      afterOutsideRef,\n      beforeInsideRef,\n      afterInsideRef,\n      portalNode,\n      setFocusManagerState\n    }), [preserveTabOrder, portalNode])\n  }, shouldRenderGuards && portalNode && /*#__PURE__*/React.createElement(FocusGuard, {\n    \"data-type\": \"outside\",\n    ref: beforeOutsideRef,\n    onFocus: event => {\n      if (isOutsideEvent(event, portalNode)) {\n        var _beforeInsideRef$curr;\n        (_beforeInsideRef$curr = beforeInsideRef.current) == null || _beforeInsideRef$curr.focus();\n      } else {\n        const prevTabbable = getPreviousTabbable() || (focusManagerState == null ? void 0 : focusManagerState.refs.domReference.current);\n        prevTabbable == null || prevTabbable.focus();\n      }\n    }\n  }), shouldRenderGuards && portalNode && /*#__PURE__*/React.createElement(\"span\", {\n    \"aria-owns\": portalNode.id,\n    style: HIDDEN_STYLES\n  }), portalNode && /*#__PURE__*/createPortal(children, portalNode), shouldRenderGuards && portalNode && /*#__PURE__*/React.createElement(FocusGuard, {\n    \"data-type\": \"outside\",\n    ref: afterOutsideRef,\n    onFocus: event => {\n      if (isOutsideEvent(event, portalNode)) {\n        var _afterInsideRef$curre;\n        (_afterInsideRef$curre = afterInsideRef.current) == null || _afterInsideRef$curre.focus();\n      } else {\n        const nextTabbable = getNextTabbable() || (focusManagerState == null ? void 0 : focusManagerState.refs.domReference.current);\n        nextTabbable == null || nextTabbable.focus();\n        (focusManagerState == null ? void 0 : focusManagerState.closeOnFocusOut) && (focusManagerState == null ? void 0 : focusManagerState.onOpenChange(false, event.nativeEvent));\n      }\n    }\n  }));\n}\nconst usePortalContext = () => React.useContext(PortalContext);\n\nconst LIST_LIMIT = 20;\nlet previouslyFocusedElements = [];\nfunction addPreviouslyFocusedElement(element) {\n  previouslyFocusedElements = previouslyFocusedElements.filter(el => el.isConnected);\n  let tabbableEl = element;\n  if (!tabbableEl || getNodeName(tabbableEl) === 'body') return;\n  if (!isTabbable(tabbableEl, getTabbableOptions())) {\n    const tabbableChild = tabbable(tabbableEl, getTabbableOptions())[0];\n    if (tabbableChild) {\n      tabbableEl = tabbableChild;\n    }\n  }\n  previouslyFocusedElements.push(tabbableEl);\n  if (previouslyFocusedElements.length > LIST_LIMIT) {\n    previouslyFocusedElements = previouslyFocusedElements.slice(-LIST_LIMIT);\n  }\n}\nfunction getPreviouslyFocusedElement() {\n  return previouslyFocusedElements.slice().reverse().find(el => el.isConnected);\n}\nconst VisuallyHiddenDismiss = /*#__PURE__*/React.forwardRef(function VisuallyHiddenDismiss(props, ref) {\n  return /*#__PURE__*/React.createElement(\"button\", _extends({}, props, {\n    type: \"button\",\n    ref: ref,\n    tabIndex: -1,\n    style: HIDDEN_STYLES\n  }));\n});\n/**\n * Provides focus management for the floating element.\n * @see https://floating-ui.com/docs/FloatingFocusManager\n */\nfunction FloatingFocusManager(props) {\n  const {\n    context,\n    children,\n    disabled = false,\n    order = ['content'],\n    guards: _guards = true,\n    initialFocus = 0,\n    returnFocus = true,\n    modal = true,\n    visuallyHiddenDismiss = false,\n    closeOnFocusOut = true\n  } = props;\n  const {\n    open,\n    refs,\n    nodeId,\n    onOpenChange,\n    events,\n    dataRef,\n    elements: {\n      domReference,\n      floating\n    }\n  } = context;\n  const ignoreInitialFocus = typeof initialFocus === 'number' && initialFocus < 0;\n  // If the reference is a combobox and is typeable (e.g. input/textarea),\n  // there are different focus semantics. The guards should not be rendered, but\n  // aria-hidden should be applied to all nodes still. Further, the visually\n  // hidden dismiss button should only appear at the end of the list, not the\n  // start.\n  const isUntrappedTypeableCombobox = isTypeableCombobox(domReference) && ignoreInitialFocus;\n\n  // Force the guards to be rendered if the `inert` attribute is not supported.\n  const guards = supportsInert() ? _guards : true;\n  const orderRef = useLatestRef(order);\n  const initialFocusRef = useLatestRef(initialFocus);\n  const returnFocusRef = useLatestRef(returnFocus);\n  const tree = useFloatingTree();\n  const portalContext = usePortalContext();\n  const startDismissButtonRef = React.useRef(null);\n  const endDismissButtonRef = React.useRef(null);\n  const preventReturnFocusRef = React.useRef(false);\n  const isPointerDownRef = React.useRef(false);\n  const isInsidePortal = portalContext != null;\n  const getTabbableContent = React.useCallback(function (container) {\n    if (container === void 0) {\n      container = floating;\n    }\n    return container ? tabbable(container, getTabbableOptions()) : [];\n  }, [floating]);\n  const getTabbableElements = React.useCallback(container => {\n    const content = getTabbableContent(container);\n    return orderRef.current.map(type => {\n      if (domReference && type === 'reference') {\n        return domReference;\n      }\n      if (floating && type === 'floating') {\n        return floating;\n      }\n      return content;\n    }).filter(Boolean).flat();\n  }, [domReference, floating, orderRef, getTabbableContent]);\n  React.useEffect(() => {\n    if (disabled || !modal) return;\n    function onKeyDown(event) {\n      if (event.key === 'Tab') {\n        // The focus guards have nothing to focus, so we need to stop the event.\n        if (contains(floating, activeElement(getDocument(floating))) && getTabbableContent().length === 0 && !isUntrappedTypeableCombobox) {\n          stopEvent(event);\n        }\n        const els = getTabbableElements();\n        const target = getTarget(event);\n        if (orderRef.current[0] === 'reference' && target === domReference) {\n          stopEvent(event);\n          if (event.shiftKey) {\n            enqueueFocus(els[els.length - 1]);\n          } else {\n            enqueueFocus(els[1]);\n          }\n        }\n        if (orderRef.current[1] === 'floating' && target === floating && event.shiftKey) {\n          stopEvent(event);\n          enqueueFocus(els[0]);\n        }\n      }\n    }\n    const doc = getDocument(floating);\n    doc.addEventListener('keydown', onKeyDown);\n    return () => {\n      doc.removeEventListener('keydown', onKeyDown);\n    };\n  }, [disabled, domReference, floating, modal, orderRef, isUntrappedTypeableCombobox, getTabbableContent, getTabbableElements]);\n  React.useEffect(() => {\n    if (disabled || !closeOnFocusOut) return;\n\n    // In Safari, buttons lose focus when pressing them.\n    function handlePointerDown() {\n      isPointerDownRef.current = true;\n      setTimeout(() => {\n        isPointerDownRef.current = false;\n      });\n    }\n    function handleFocusOutside(event) {\n      const relatedTarget = event.relatedTarget;\n      queueMicrotask(() => {\n        const movedToUnrelatedNode = !(contains(domReference, relatedTarget) || contains(floating, relatedTarget) || contains(relatedTarget, floating) || contains(portalContext == null ? void 0 : portalContext.portalNode, relatedTarget) || relatedTarget != null && relatedTarget.hasAttribute(createAttribute('focus-guard')) || tree && (getChildren(tree.nodesRef.current, nodeId).find(node => {\n          var _node$context, _node$context2;\n          return contains((_node$context = node.context) == null ? void 0 : _node$context.elements.floating, relatedTarget) || contains((_node$context2 = node.context) == null ? void 0 : _node$context2.elements.domReference, relatedTarget);\n        }) || getAncestors(tree.nodesRef.current, nodeId).find(node => {\n          var _node$context3, _node$context4;\n          return ((_node$context3 = node.context) == null ? void 0 : _node$context3.elements.floating) === relatedTarget || ((_node$context4 = node.context) == null ? void 0 : _node$context4.elements.domReference) === relatedTarget;\n        })));\n\n        // Focus did not move inside the floating tree, and there are no tabbable\n        // portal guards to handle closing.\n        if (relatedTarget && movedToUnrelatedNode && !isPointerDownRef.current &&\n        // Fix React 18 Strict Mode returnFocus due to double rendering.\n        relatedTarget !== getPreviouslyFocusedElement()) {\n          preventReturnFocusRef.current = true;\n          onOpenChange(false, event);\n        }\n      });\n    }\n    if (floating && isHTMLElement(domReference)) {\n      domReference.addEventListener('focusout', handleFocusOutside);\n      domReference.addEventListener('pointerdown', handlePointerDown);\n      !modal && floating.addEventListener('focusout', handleFocusOutside);\n      return () => {\n        domReference.removeEventListener('focusout', handleFocusOutside);\n        domReference.removeEventListener('pointerdown', handlePointerDown);\n        !modal && floating.removeEventListener('focusout', handleFocusOutside);\n      };\n    }\n  }, [disabled, domReference, floating, modal, nodeId, tree, portalContext, onOpenChange, closeOnFocusOut]);\n  React.useEffect(() => {\n    var _portalContext$portal;\n    if (disabled) return;\n\n    // Don't hide portals nested within the parent portal.\n    const portalNodes = Array.from((portalContext == null || (_portalContext$portal = portalContext.portalNode) == null ? void 0 : _portalContext$portal.querySelectorAll(\"[\" + createAttribute('portal') + \"]\")) || []);\n    if (floating) {\n      const insideElements = [floating, ...portalNodes, startDismissButtonRef.current, endDismissButtonRef.current, orderRef.current.includes('reference') || isUntrappedTypeableCombobox ? domReference : null].filter(x => x != null);\n      const cleanup = modal || isUntrappedTypeableCombobox ? markOthers(insideElements, guards, !guards) : markOthers(insideElements);\n      return () => {\n        cleanup();\n      };\n    }\n  }, [disabled, domReference, floating, modal, orderRef, portalContext, isUntrappedTypeableCombobox, guards]);\n  index(() => {\n    if (disabled || !floating) return;\n    const doc = getDocument(floating);\n    const previouslyFocusedElement = activeElement(doc);\n\n    // Wait for any layout effect state setters to execute to set `tabIndex`.\n    queueMicrotask(() => {\n      const focusableElements = getTabbableElements(floating);\n      const initialFocusValue = initialFocusRef.current;\n      const elToFocus = (typeof initialFocusValue === 'number' ? focusableElements[initialFocusValue] : initialFocusValue.current) || floating;\n      const focusAlreadyInsideFloatingEl = contains(floating, previouslyFocusedElement);\n      if (!ignoreInitialFocus && !focusAlreadyInsideFloatingEl && open) {\n        enqueueFocus(elToFocus, {\n          preventScroll: elToFocus === floating\n        });\n      }\n    });\n  }, [disabled, open, floating, ignoreInitialFocus, getTabbableElements, initialFocusRef]);\n  index(() => {\n    if (disabled || !floating) return;\n    let preventReturnFocusScroll = false;\n    const doc = getDocument(floating);\n    const previouslyFocusedElement = activeElement(doc);\n    const contextData = dataRef.current;\n    let openEvent = contextData.openEvent;\n    addPreviouslyFocusedElement(previouslyFocusedElement);\n\n    // Dismissing via outside press should always ignore `returnFocus` to\n    // prevent unwanted scrolling.\n    function onOpenChange(_ref) {\n      let {\n        open,\n        reason,\n        event,\n        nested\n      } = _ref;\n      if (open) {\n        openEvent = event;\n      }\n      if (reason === 'escape-key' && refs.domReference.current) {\n        addPreviouslyFocusedElement(refs.domReference.current);\n      }\n      if (reason === 'hover' && event.type === 'mouseleave') {\n        preventReturnFocusRef.current = true;\n      }\n      if (reason !== 'outside-press') return;\n      if (nested) {\n        preventReturnFocusRef.current = false;\n        preventReturnFocusScroll = true;\n      } else {\n        preventReturnFocusRef.current = !(isVirtualClick(event) || isVirtualPointerEvent(event));\n      }\n    }\n    events.on('openchange', onOpenChange);\n    return () => {\n      events.off('openchange', onOpenChange);\n      const activeEl = activeElement(doc);\n      const isFocusInsideFloatingTree = contains(floating, activeEl) || tree && getChildren(tree.nodesRef.current, nodeId).some(node => {\n        var _node$context5;\n        return contains((_node$context5 = node.context) == null ? void 0 : _node$context5.elements.floating, activeEl);\n      });\n      const shouldFocusReference = isFocusInsideFloatingTree || openEvent && ['click', 'mousedown'].includes(openEvent.type);\n      if (shouldFocusReference && refs.domReference.current) {\n        addPreviouslyFocusedElement(refs.domReference.current);\n      }\n      const returnElement = getPreviouslyFocusedElement();\n      if (\n      // eslint-disable-next-line react-hooks/exhaustive-deps\n      returnFocusRef.current && !preventReturnFocusRef.current && isHTMLElement(returnElement) && (\n      // If the focus moved somewhere else after mount, avoid returning focus\n      // since it likely entered a different element which should be\n      // respected: https://github.com/floating-ui/floating-ui/issues/2607\n      returnElement !== activeEl && activeEl !== doc.body ? isFocusInsideFloatingTree : true)) {\n        enqueueFocus(returnElement, {\n          // When dismissing nested floating elements, by the time the rAF has\n          // executed, the menus will all have been unmounted. When they try\n          // to get focused, the calls get ignored — leaving the root\n          // reference focused as desired.\n          cancelPrevious: false,\n          preventScroll: preventReturnFocusScroll\n        });\n      }\n    };\n  }, [disabled, floating, returnFocusRef, dataRef, refs, events, tree, nodeId]);\n\n  // Synchronize the `context` & `modal` value to the FloatingPortal context.\n  // It will decide whether or not it needs to render its own guards.\n  index(() => {\n    if (disabled || !portalContext) return;\n    portalContext.setFocusManagerState({\n      modal,\n      closeOnFocusOut,\n      open,\n      onOpenChange,\n      refs\n    });\n    return () => {\n      portalContext.setFocusManagerState(null);\n    };\n  }, [disabled, portalContext, modal, open, onOpenChange, refs, closeOnFocusOut]);\n  index(() => {\n    if (disabled || !floating || typeof MutationObserver !== 'function' || ignoreInitialFocus) {\n      return;\n    }\n    const handleMutation = () => {\n      const tabIndex = floating.getAttribute('tabindex');\n      if (orderRef.current.includes('floating') || activeElement(getDocument(floating)) !== refs.domReference.current && getTabbableContent().length === 0) {\n        if (tabIndex !== '0') {\n          floating.setAttribute('tabindex', '0');\n        }\n      } else if (tabIndex !== '-1') {\n        floating.setAttribute('tabindex', '-1');\n      }\n    };\n    handleMutation();\n    const observer = new MutationObserver(handleMutation);\n    observer.observe(floating, {\n      childList: true,\n      subtree: true,\n      attributes: true\n    });\n    return () => {\n      observer.disconnect();\n    };\n  }, [disabled, floating, refs, orderRef, getTabbableContent, ignoreInitialFocus]);\n  function renderDismissButton(location) {\n    if (disabled || !visuallyHiddenDismiss || !modal) {\n      return null;\n    }\n    return /*#__PURE__*/React.createElement(VisuallyHiddenDismiss, {\n      ref: location === 'start' ? startDismissButtonRef : endDismissButtonRef,\n      onClick: event => onOpenChange(false, event.nativeEvent)\n    }, typeof visuallyHiddenDismiss === 'string' ? visuallyHiddenDismiss : 'Dismiss');\n  }\n  const shouldRenderGuards = !disabled && guards && (isInsidePortal || modal);\n  return /*#__PURE__*/React.createElement(React.Fragment, null, shouldRenderGuards && /*#__PURE__*/React.createElement(FocusGuard, {\n    \"data-type\": \"inside\",\n    ref: portalContext == null ? void 0 : portalContext.beforeInsideRef,\n    onFocus: event => {\n      if (modal) {\n        const els = getTabbableElements();\n        enqueueFocus(order[0] === 'reference' ? els[0] : els[els.length - 1]);\n      } else if (portalContext != null && portalContext.preserveTabOrder && portalContext.portalNode) {\n        preventReturnFocusRef.current = false;\n        if (isOutsideEvent(event, portalContext.portalNode)) {\n          const nextTabbable = getNextTabbable() || domReference;\n          nextTabbable == null || nextTabbable.focus();\n        } else {\n          var _portalContext$before;\n          (_portalContext$before = portalContext.beforeOutsideRef.current) == null || _portalContext$before.focus();\n        }\n      }\n    }\n  }), !isUntrappedTypeableCombobox && renderDismissButton('start'), children, renderDismissButton('end'), shouldRenderGuards && /*#__PURE__*/React.createElement(FocusGuard, {\n    \"data-type\": \"inside\",\n    ref: portalContext == null ? void 0 : portalContext.afterInsideRef,\n    onFocus: event => {\n      if (modal) {\n        enqueueFocus(getTabbableElements()[0]);\n      } else if (portalContext != null && portalContext.preserveTabOrder && portalContext.portalNode) {\n        if (closeOnFocusOut) {\n          preventReturnFocusRef.current = true;\n        }\n        if (isOutsideEvent(event, portalContext.portalNode)) {\n          const prevTabbable = getPreviousTabbable() || domReference;\n          prevTabbable == null || prevTabbable.focus();\n        } else {\n          var _portalContext$afterO;\n          (_portalContext$afterO = portalContext.afterOutsideRef.current) == null || _portalContext$afterO.focus();\n        }\n      }\n    }\n  }));\n}\n\nconst activeLocks = /*#__PURE__*/new Set();\n/**\n * Provides base styling for a fixed overlay element to dim content or block\n * pointer events behind a floating element.\n * It's a regular `<div>`, so it can be styled via any CSS solution you prefer.\n * @see https://floating-ui.com/docs/FloatingOverlay\n */\nconst FloatingOverlay = /*#__PURE__*/React.forwardRef(function FloatingOverlay(props, ref) {\n  const {\n    lockScroll = false,\n    ...rest\n  } = props;\n  const lockId = useId();\n  index(() => {\n    if (!lockScroll) return;\n    activeLocks.add(lockId);\n    const isIOS = /iP(hone|ad|od)|iOS/.test(getPlatform());\n    const bodyStyle = document.body.style;\n    // RTL <body> scrollbar\n    const scrollbarX = Math.round(document.documentElement.getBoundingClientRect().left) + document.documentElement.scrollLeft;\n    const paddingProp = scrollbarX ? 'paddingLeft' : 'paddingRight';\n    const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth;\n    const scrollX = bodyStyle.left ? parseFloat(bodyStyle.left) : window.pageXOffset;\n    const scrollY = bodyStyle.top ? parseFloat(bodyStyle.top) : window.pageYOffset;\n    bodyStyle.overflow = 'hidden';\n    if (scrollbarWidth) {\n      bodyStyle[paddingProp] = scrollbarWidth + \"px\";\n    }\n\n    // Only iOS doesn't respect `overflow: hidden` on document.body, and this\n    // technique has fewer side effects.\n    if (isIOS) {\n      var _window$visualViewpor, _window$visualViewpor2;\n      // iOS 12 does not support `visualViewport`.\n      const offsetLeft = ((_window$visualViewpor = window.visualViewport) == null ? void 0 : _window$visualViewpor.offsetLeft) || 0;\n      const offsetTop = ((_window$visualViewpor2 = window.visualViewport) == null ? void 0 : _window$visualViewpor2.offsetTop) || 0;\n      Object.assign(bodyStyle, {\n        position: 'fixed',\n        top: -(scrollY - Math.floor(offsetTop)) + \"px\",\n        left: -(scrollX - Math.floor(offsetLeft)) + \"px\",\n        right: '0'\n      });\n    }\n    return () => {\n      activeLocks.delete(lockId);\n      if (activeLocks.size === 0) {\n        Object.assign(bodyStyle, {\n          overflow: '',\n          [paddingProp]: ''\n        });\n        if (isIOS) {\n          Object.assign(bodyStyle, {\n            position: '',\n            top: '',\n            left: '',\n            right: ''\n          });\n          window.scrollTo(scrollX, scrollY);\n        }\n      }\n    };\n  }, [lockId, lockScroll]);\n  return /*#__PURE__*/React.createElement(\"div\", _extends({\n    ref: ref\n  }, rest, {\n    style: {\n      position: 'fixed',\n      overflow: 'auto',\n      top: 0,\n      right: 0,\n      bottom: 0,\n      left: 0,\n      ...rest.style\n    }\n  }));\n});\n\nfunction isButtonTarget(event) {\n  return isHTMLElement(event.target) && event.target.tagName === 'BUTTON';\n}\nfunction isSpaceIgnored(element) {\n  return isTypeableElement(element);\n}\n/**\n * Opens or closes the floating element when clicking the reference element.\n * @see https://floating-ui.com/docs/useClick\n */\nfunction useClick(context, props) {\n  if (props === void 0) {\n    props = {};\n  }\n  const {\n    open,\n    onOpenChange,\n    dataRef,\n    elements: {\n      domReference\n    }\n  } = context;\n  const {\n    enabled = true,\n    event: eventOption = 'click',\n    toggle = true,\n    ignoreMouse = false,\n    keyboardHandlers = true\n  } = props;\n  const pointerTypeRef = React.useRef();\n  const didKeyDownRef = React.useRef(false);\n  return React.useMemo(() => {\n    if (!enabled) return {};\n    return {\n      reference: {\n        onPointerDown(event) {\n          pointerTypeRef.current = event.pointerType;\n        },\n        onMouseDown(event) {\n          // Ignore all buttons except for the \"main\" button.\n          // https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/button\n          if (event.button !== 0) {\n            return;\n          }\n          if (isMouseLikePointerType(pointerTypeRef.current, true) && ignoreMouse) {\n            return;\n          }\n          if (eventOption === 'click') {\n            return;\n          }\n          if (open && toggle && (dataRef.current.openEvent ? dataRef.current.openEvent.type === 'mousedown' : true)) {\n            onOpenChange(false, event.nativeEvent, 'click');\n          } else {\n            // Prevent stealing focus from the floating element\n            event.preventDefault();\n            onOpenChange(true, event.nativeEvent, 'click');\n          }\n        },\n        onClick(event) {\n          if (eventOption === 'mousedown' && pointerTypeRef.current) {\n            pointerTypeRef.current = undefined;\n            return;\n          }\n          if (isMouseLikePointerType(pointerTypeRef.current, true) && ignoreMouse) {\n            return;\n          }\n          if (open && toggle && (dataRef.current.openEvent ? dataRef.current.openEvent.type === 'click' : true)) {\n            onOpenChange(false, event.nativeEvent, 'click');\n          } else {\n            onOpenChange(true, event.nativeEvent, 'click');\n          }\n        },\n        onKeyDown(event) {\n          pointerTypeRef.current = undefined;\n          if (event.defaultPrevented || !keyboardHandlers || isButtonTarget(event)) {\n            return;\n          }\n          if (event.key === ' ' && !isSpaceIgnored(domReference)) {\n            // Prevent scrolling\n            event.preventDefault();\n            didKeyDownRef.current = true;\n          }\n          if (event.key === 'Enter') {\n            if (open && toggle) {\n              onOpenChange(false, event.nativeEvent, 'click');\n            } else {\n              onOpenChange(true, event.nativeEvent, 'click');\n            }\n          }\n        },\n        onKeyUp(event) {\n          if (event.defaultPrevented || !keyboardHandlers || isButtonTarget(event) || isSpaceIgnored(domReference)) {\n            return;\n          }\n          if (event.key === ' ' && didKeyDownRef.current) {\n            didKeyDownRef.current = false;\n            if (open && toggle) {\n              onOpenChange(false, event.nativeEvent, 'click');\n            } else {\n              onOpenChange(true, event.nativeEvent, 'click');\n            }\n          }\n        }\n      }\n    };\n  }, [enabled, dataRef, eventOption, ignoreMouse, keyboardHandlers, domReference, toggle, open, onOpenChange]);\n}\n\nfunction createVirtualElement(domElement, data) {\n  let offsetX = null;\n  let offsetY = null;\n  let isAutoUpdateEvent = false;\n  return {\n    contextElement: domElement || undefined,\n    getBoundingClientRect() {\n      var _data$dataRef$current;\n      const domRect = (domElement == null ? void 0 : domElement.getBoundingClientRect()) || {\n        width: 0,\n        height: 0,\n        x: 0,\n        y: 0\n      };\n      const isXAxis = data.axis === 'x' || data.axis === 'both';\n      const isYAxis = data.axis === 'y' || data.axis === 'both';\n      const canTrackCursorOnAutoUpdate = ['mouseenter', 'mousemove'].includes(((_data$dataRef$current = data.dataRef.current.openEvent) == null ? void 0 : _data$dataRef$current.type) || '') && data.pointerType !== 'touch';\n      let width = domRect.width;\n      let height = domRect.height;\n      let x = domRect.x;\n      let y = domRect.y;\n      if (offsetX == null && data.x && isXAxis) {\n        offsetX = domRect.x - data.x;\n      }\n      if (offsetY == null && data.y && isYAxis) {\n        offsetY = domRect.y - data.y;\n      }\n      x -= offsetX || 0;\n      y -= offsetY || 0;\n      width = 0;\n      height = 0;\n      if (!isAutoUpdateEvent || canTrackCursorOnAutoUpdate) {\n        width = data.axis === 'y' ? domRect.width : 0;\n        height = data.axis === 'x' ? domRect.height : 0;\n        x = isXAxis && data.x != null ? data.x : x;\n        y = isYAxis && data.y != null ? data.y : y;\n      } else if (isAutoUpdateEvent && !canTrackCursorOnAutoUpdate) {\n        height = data.axis === 'x' ? domRect.height : height;\n        width = data.axis === 'y' ? domRect.width : width;\n      }\n      isAutoUpdateEvent = true;\n      return {\n        width,\n        height,\n        x,\n        y,\n        top: y,\n        right: x + width,\n        bottom: y + height,\n        left: x\n      };\n    }\n  };\n}\nfunction isMouseBasedEvent(event) {\n  return event != null && event.clientX != null;\n}\n/**\n * Positions the floating element relative to a client point (in the viewport),\n * such as the mouse position. By default, it follows the mouse cursor.\n * @see https://floating-ui.com/docs/useClientPoint\n */\nfunction useClientPoint(context, props) {\n  if (props === void 0) {\n    props = {};\n  }\n  const {\n    open,\n    dataRef,\n    elements: {\n      floating,\n      domReference\n    },\n    refs\n  } = context;\n  const {\n    enabled = true,\n    axis = 'both',\n    x = null,\n    y = null\n  } = props;\n  const initialRef = React.useRef(false);\n  const cleanupListenerRef = React.useRef(null);\n  const [pointerType, setPointerType] = React.useState();\n  const [reactive, setReactive] = React.useState([]);\n  const setReference = useEffectEvent((x, y) => {\n    if (initialRef.current) return;\n\n    // Prevent setting if the open event was not a mouse-like one\n    // (e.g. focus to open, then hover over the reference element).\n    // Only apply if the event exists.\n    if (dataRef.current.openEvent && !isMouseBasedEvent(dataRef.current.openEvent)) {\n      return;\n    }\n    refs.setPositionReference(createVirtualElement(domReference, {\n      x,\n      y,\n      axis,\n      dataRef,\n      pointerType\n    }));\n  });\n  const handleReferenceEnterOrMove = useEffectEvent(event => {\n    if (x != null || y != null) return;\n    if (!open) {\n      setReference(event.clientX, event.clientY);\n    } else if (!cleanupListenerRef.current) {\n      // If there's no cleanup, there's no listener, but we want to ensure\n      // we add the listener if the cursor landed on the floating element and\n      // then back on the reference (i.e. it's interactive).\n      setReactive([]);\n    }\n  });\n\n  // If the pointer is a mouse-like pointer, we want to continue following the\n  // mouse even if the floating element is transitioning out. On touch\n  // devices, this is undesirable because the floating element will move to\n  // the dismissal touch point.\n  const openCheck = isMouseLikePointerType(pointerType) ? floating : open;\n  const addListener = React.useCallback(() => {\n    // Explicitly specified `x`/`y` coordinates shouldn't add a listener.\n    if (!openCheck || !enabled || x != null || y != null) return;\n    const win = getWindow(floating);\n    function handleMouseMove(event) {\n      const target = getTarget(event);\n      if (!contains(floating, target)) {\n        setReference(event.clientX, event.clientY);\n      } else {\n        win.removeEventListener('mousemove', handleMouseMove);\n        cleanupListenerRef.current = null;\n      }\n    }\n    if (!dataRef.current.openEvent || isMouseBasedEvent(dataRef.current.openEvent)) {\n      win.addEventListener('mousemove', handleMouseMove);\n      const cleanup = () => {\n        win.removeEventListener('mousemove', handleMouseMove);\n        cleanupListenerRef.current = null;\n      };\n      cleanupListenerRef.current = cleanup;\n      return cleanup;\n    }\n    refs.setPositionReference(domReference);\n  }, [openCheck, enabled, x, y, floating, dataRef, refs, domReference, setReference]);\n  React.useEffect(() => {\n    return addListener();\n  }, [addListener, reactive]);\n  React.useEffect(() => {\n    if (enabled && !floating) {\n      initialRef.current = false;\n    }\n  }, [enabled, floating]);\n  React.useEffect(() => {\n    if (!enabled && open) {\n      initialRef.current = true;\n    }\n  }, [enabled, open]);\n  index(() => {\n    if (enabled && (x != null || y != null)) {\n      initialRef.current = false;\n      setReference(x, y);\n    }\n  }, [enabled, x, y, setReference]);\n  return React.useMemo(() => {\n    if (!enabled) return {};\n    function setPointerTypeRef(_ref) {\n      let {\n        pointerType\n      } = _ref;\n      setPointerType(pointerType);\n    }\n    return {\n      reference: {\n        onPointerDown: setPointerTypeRef,\n        onPointerEnter: setPointerTypeRef,\n        onMouseMove: handleReferenceEnterOrMove,\n        onMouseEnter: handleReferenceEnterOrMove\n      }\n    };\n  }, [enabled, handleReferenceEnterOrMove]);\n}\n\nconst bubbleHandlerKeys = {\n  pointerdown: 'onPointerDown',\n  mousedown: 'onMouseDown',\n  click: 'onClick'\n};\nconst captureHandlerKeys = {\n  pointerdown: 'onPointerDownCapture',\n  mousedown: 'onMouseDownCapture',\n  click: 'onClickCapture'\n};\nconst normalizeProp = normalizable => {\n  var _normalizable$escapeK, _normalizable$outside;\n  return {\n    escapeKey: typeof normalizable === 'boolean' ? normalizable : (_normalizable$escapeK = normalizable == null ? void 0 : normalizable.escapeKey) != null ? _normalizable$escapeK : false,\n    outsidePress: typeof normalizable === 'boolean' ? normalizable : (_normalizable$outside = normalizable == null ? void 0 : normalizable.outsidePress) != null ? _normalizable$outside : true\n  };\n};\n/**\n * Closes the floating element when a dismissal is requested — by default, when\n * the user presses the `escape` key or outside of the floating element.\n * @see https://floating-ui.com/docs/useDismiss\n */\nfunction useDismiss(context, props) {\n  if (props === void 0) {\n    props = {};\n  }\n  const {\n    open,\n    onOpenChange,\n    elements: {\n      reference,\n      domReference,\n      floating\n    },\n    dataRef\n  } = context;\n  const {\n    enabled = true,\n    escapeKey = true,\n    outsidePress: unstable_outsidePress = true,\n    outsidePressEvent = 'pointerdown',\n    referencePress = false,\n    referencePressEvent = 'pointerdown',\n    ancestorScroll = false,\n    bubbles,\n    capture\n  } = props;\n  const tree = useFloatingTree();\n  const outsidePressFn = useEffectEvent(typeof unstable_outsidePress === 'function' ? unstable_outsidePress : () => false);\n  const outsidePress = typeof unstable_outsidePress === 'function' ? outsidePressFn : unstable_outsidePress;\n  const insideReactTreeRef = React.useRef(false);\n  const endedOrStartedInsideRef = React.useRef(false);\n  const {\n    escapeKey: escapeKeyBubbles,\n    outsidePress: outsidePressBubbles\n  } = normalizeProp(bubbles);\n  const {\n    escapeKey: escapeKeyCapture,\n    outsidePress: outsidePressCapture\n  } = normalizeProp(capture);\n  const closeOnEscapeKeyDown = useEffectEvent(event => {\n    var _dataRef$current$floa;\n    if (!open || !enabled || !escapeKey || event.key !== 'Escape') {\n      return;\n    }\n    const nodeId = (_dataRef$current$floa = dataRef.current.floatingContext) == null ? void 0 : _dataRef$current$floa.nodeId;\n    const children = tree ? getChildren(tree.nodesRef.current, nodeId) : [];\n    if (!escapeKeyBubbles) {\n      event.stopPropagation();\n      if (children.length > 0) {\n        let shouldDismiss = true;\n        children.forEach(child => {\n          var _child$context;\n          if ((_child$context = child.context) != null && _child$context.open && !child.context.dataRef.current.__escapeKeyBubbles) {\n            shouldDismiss = false;\n            return;\n          }\n        });\n        if (!shouldDismiss) {\n          return;\n        }\n      }\n    }\n    onOpenChange(false, isReactEvent(event) ? event.nativeEvent : event, 'escape-key');\n  });\n  const closeOnEscapeKeyDownCapture = useEffectEvent(event => {\n    var _getTarget2;\n    const callback = () => {\n      var _getTarget;\n      closeOnEscapeKeyDown(event);\n      (_getTarget = getTarget(event)) == null || _getTarget.removeEventListener('keydown', callback);\n    };\n    (_getTarget2 = getTarget(event)) == null || _getTarget2.addEventListener('keydown', callback);\n  });\n  const closeOnPressOutside = useEffectEvent(event => {\n    var _dataRef$current$floa2;\n    // Given developers can stop the propagation of the synthetic event,\n    // we can only be confident with a positive value.\n    const insideReactTree = insideReactTreeRef.current;\n    insideReactTreeRef.current = false;\n\n    // When click outside is lazy (`click` event), handle dragging.\n    // Don't close if:\n    // - The click started inside the floating element.\n    // - The click ended inside the floating element.\n    const endedOrStartedInside = endedOrStartedInsideRef.current;\n    endedOrStartedInsideRef.current = false;\n    if (outsidePressEvent === 'click' && endedOrStartedInside) {\n      return;\n    }\n    if (insideReactTree) {\n      return;\n    }\n    if (typeof outsidePress === 'function' && !outsidePress(event)) {\n      return;\n    }\n    const target = getTarget(event);\n    const inertSelector = \"[\" + createAttribute('inert') + \"]\";\n    const markers = getDocument(floating).querySelectorAll(inertSelector);\n    let targetRootAncestor = isElement(target) ? target : null;\n    while (targetRootAncestor && !isLastTraversableNode(targetRootAncestor)) {\n      const nextParent = getParentNode(targetRootAncestor);\n      if (isLastTraversableNode(nextParent) || !isElement(nextParent)) {\n        break;\n      }\n      targetRootAncestor = nextParent;\n    }\n\n    // Check if the click occurred on a third-party element injected after the\n    // floating element rendered.\n    if (markers.length && isElement(target) && !isRootElement(target) &&\n    // Clicked on a direct ancestor (e.g. FloatingOverlay).\n    !contains(target, floating) &&\n    // If the target root element contains none of the markers, then the\n    // element was injected after the floating element rendered.\n    Array.from(markers).every(marker => !contains(targetRootAncestor, marker))) {\n      return;\n    }\n\n    // Check if the click occurred on the scrollbar\n    if (isHTMLElement(target) && floating) {\n      // In Firefox, `target.scrollWidth > target.clientWidth` for inline\n      // elements.\n      const canScrollX = target.clientWidth > 0 && target.scrollWidth > target.clientWidth;\n      const canScrollY = target.clientHeight > 0 && target.scrollHeight > target.clientHeight;\n      let xCond = canScrollY && event.offsetX > target.clientWidth;\n\n      // In some browsers it is possible to change the <body> (or window)\n      // scrollbar to the left side, but is very rare and is difficult to\n      // check for. Plus, for modal dialogs with backdrops, it is more\n      // important that the backdrop is checked but not so much the window.\n      if (canScrollY) {\n        const isRTL = getComputedStyle(target).direction === 'rtl';\n        if (isRTL) {\n          xCond = event.offsetX <= target.offsetWidth - target.clientWidth;\n        }\n      }\n      if (xCond || canScrollX && event.offsetY > target.clientHeight) {\n        return;\n      }\n    }\n    const nodeId = (_dataRef$current$floa2 = dataRef.current.floatingContext) == null ? void 0 : _dataRef$current$floa2.nodeId;\n    const targetIsInsideChildren = tree && getChildren(tree.nodesRef.current, nodeId).some(node => {\n      var _node$context;\n      return isEventTargetWithin(event, (_node$context = node.context) == null ? void 0 : _node$context.elements.floating);\n    });\n    if (isEventTargetWithin(event, floating) || isEventTargetWithin(event, domReference) || targetIsInsideChildren) {\n      return;\n    }\n    const children = tree ? getChildren(tree.nodesRef.current, nodeId) : [];\n    if (children.length > 0) {\n      let shouldDismiss = true;\n      children.forEach(child => {\n        var _child$context2;\n        if ((_child$context2 = child.context) != null && _child$context2.open && !child.context.dataRef.current.__outsidePressBubbles) {\n          shouldDismiss = false;\n          return;\n        }\n      });\n      if (!shouldDismiss) {\n        return;\n      }\n    }\n    onOpenChange(false, event, 'outside-press');\n  });\n  const closeOnPressOutsideCapture = useEffectEvent(event => {\n    var _getTarget4;\n    const callback = () => {\n      var _getTarget3;\n      closeOnPressOutside(event);\n      (_getTarget3 = getTarget(event)) == null || _getTarget3.removeEventListener(outsidePressEvent, callback);\n    };\n    (_getTarget4 = getTarget(event)) == null || _getTarget4.addEventListener(outsidePressEvent, callback);\n  });\n  React.useEffect(() => {\n    if (!open || !enabled) {\n      return;\n    }\n    dataRef.current.__escapeKeyBubbles = escapeKeyBubbles;\n    dataRef.current.__outsidePressBubbles = outsidePressBubbles;\n    function onScroll(event) {\n      onOpenChange(false, event, 'ancestor-scroll');\n    }\n    const doc = getDocument(floating);\n    escapeKey && doc.addEventListener('keydown', escapeKeyCapture ? closeOnEscapeKeyDownCapture : closeOnEscapeKeyDown, escapeKeyCapture);\n    outsidePress && doc.addEventListener(outsidePressEvent, outsidePressCapture ? closeOnPressOutsideCapture : closeOnPressOutside, outsidePressCapture);\n    let ancestors = [];\n    if (ancestorScroll) {\n      if (isElement(domReference)) {\n        ancestors = getOverflowAncestors(domReference);\n      }\n      if (isElement(floating)) {\n        ancestors = ancestors.concat(getOverflowAncestors(floating));\n      }\n      if (!isElement(reference) && reference && reference.contextElement) {\n        ancestors = ancestors.concat(getOverflowAncestors(reference.contextElement));\n      }\n    }\n\n    // Ignore the visual viewport for scrolling dismissal (allow pinch-zoom)\n    ancestors = ancestors.filter(ancestor => {\n      var _doc$defaultView;\n      return ancestor !== ((_doc$defaultView = doc.defaultView) == null ? void 0 : _doc$defaultView.visualViewport);\n    });\n    ancestors.forEach(ancestor => {\n      ancestor.addEventListener('scroll', onScroll, {\n        passive: true\n      });\n    });\n    return () => {\n      escapeKey && doc.removeEventListener('keydown', escapeKeyCapture ? closeOnEscapeKeyDownCapture : closeOnEscapeKeyDown, escapeKeyCapture);\n      outsidePress && doc.removeEventListener(outsidePressEvent, outsidePressCapture ? closeOnPressOutsideCapture : closeOnPressOutside, outsidePressCapture);\n      ancestors.forEach(ancestor => {\n        ancestor.removeEventListener('scroll', onScroll);\n      });\n    };\n  }, [dataRef, floating, domReference, reference, escapeKey, outsidePress, outsidePressEvent, open, onOpenChange, ancestorScroll, enabled, escapeKeyBubbles, outsidePressBubbles, closeOnEscapeKeyDown, escapeKeyCapture, closeOnEscapeKeyDownCapture, closeOnPressOutside, outsidePressCapture, closeOnPressOutsideCapture]);\n  React.useEffect(() => {\n    insideReactTreeRef.current = false;\n  }, [outsidePress, outsidePressEvent]);\n  return React.useMemo(() => {\n    if (!enabled) {\n      return {};\n    }\n    return {\n      reference: {\n        onKeyDown: closeOnEscapeKeyDown,\n        [bubbleHandlerKeys[referencePressEvent]]: event => {\n          if (referencePress) {\n            onOpenChange(false, event.nativeEvent, 'reference-press');\n          }\n        }\n      },\n      floating: {\n        onKeyDown: closeOnEscapeKeyDown,\n        onMouseDown() {\n          endedOrStartedInsideRef.current = true;\n        },\n        onMouseUp() {\n          endedOrStartedInsideRef.current = true;\n        },\n        [captureHandlerKeys[outsidePressEvent]]: () => {\n          insideReactTreeRef.current = true;\n        }\n      }\n    };\n  }, [enabled, referencePress, outsidePressEvent, referencePressEvent, onOpenChange, closeOnEscapeKeyDown]);\n}\n\nfunction useFloatingRootContext(options) {\n  const {\n    open = false,\n    onOpenChange: onOpenChangeProp,\n    elements: elementsProp\n  } = options;\n  const floatingId = useId();\n  const dataRef = React.useRef({});\n  const [events] = React.useState(() => createPubSub());\n  const nested = useFloatingParentNodeId() != null;\n  if (process.env.NODE_ENV !== \"production\") {\n    const optionDomReference = elementsProp.reference;\n    if (optionDomReference && !isElement(optionDomReference)) {\n      error('Cannot pass a virtual element to the `elements.reference` option,', 'as it must be a real DOM element. Use `refs.setPositionReference()`', 'instead.');\n    }\n  }\n  const [positionReference, setPositionReference] = React.useState(elementsProp.reference);\n  const onOpenChange = useEffectEvent((open, event, reason) => {\n    dataRef.current.openEvent = open ? event : undefined;\n    events.emit('openchange', {\n      open,\n      event,\n      reason,\n      nested\n    });\n    onOpenChangeProp == null || onOpenChangeProp(open, event, reason);\n  });\n  const refs = React.useMemo(() => ({\n    setPositionReference\n  }), []);\n  const elements = React.useMemo(() => ({\n    reference: positionReference || elementsProp.reference || null,\n    floating: elementsProp.floating || null,\n    domReference: elementsProp.reference\n  }), [positionReference, elementsProp.reference, elementsProp.floating]);\n  return React.useMemo(() => ({\n    dataRef,\n    open,\n    onOpenChange,\n    elements,\n    events,\n    floatingId,\n    refs\n  }), [open, onOpenChange, elements, events, floatingId, refs]);\n}\n\n/**\n * Provides data to position a floating element and context to add interactions.\n * @see https://floating-ui.com/docs/useFloating\n */\nfunction useFloating(options) {\n  if (options === void 0) {\n    options = {};\n  }\n  const {\n    nodeId\n  } = options;\n  const internalRootContext = useFloatingRootContext({\n    ...options,\n    elements: {\n      reference: null,\n      floating: null,\n      ...options.elements\n    }\n  });\n  const rootContext = options.rootContext || internalRootContext;\n  const computedElements = rootContext.elements;\n  const [_domReference, setDomReference] = React.useState(null);\n  const [positionReference, _setPositionReference] = React.useState(null);\n  const optionDomReference = computedElements == null ? void 0 : computedElements.reference;\n  const domReference = optionDomReference || _domReference;\n  const domReferenceRef = React.useRef(null);\n  const tree = useFloatingTree();\n  index(() => {\n    if (domReference) {\n      domReferenceRef.current = domReference;\n    }\n  }, [domReference]);\n  const position = useFloating$1({\n    ...options,\n    elements: {\n      ...computedElements,\n      ...(positionReference && {\n        reference: positionReference\n      })\n    }\n  });\n  const setPositionReference = React.useCallback(node => {\n    const computedPositionReference = isElement(node) ? {\n      getBoundingClientRect: () => node.getBoundingClientRect(),\n      contextElement: node\n    } : node;\n    // Store the positionReference in state if the DOM reference is specified externally via the\n    // `elements.reference` option. This ensures that it won't be overridden on future renders.\n    _setPositionReference(computedPositionReference);\n    position.refs.setReference(computedPositionReference);\n  }, [position.refs]);\n  const setReference = React.useCallback(node => {\n    if (isElement(node) || node === null) {\n      domReferenceRef.current = node;\n      setDomReference(node);\n    }\n\n    // Backwards-compatibility for passing a virtual element to `reference`\n    // after it has set the DOM reference.\n    if (isElement(position.refs.reference.current) || position.refs.reference.current === null ||\n    // Don't allow setting virtual elements using the old technique back to\n    // `null` to support `positionReference` + an unstable `reference`\n    // callback ref.\n    node !== null && !isElement(node)) {\n      position.refs.setReference(node);\n    }\n  }, [position.refs]);\n  const refs = React.useMemo(() => ({\n    ...position.refs,\n    setReference,\n    setPositionReference,\n    domReference: domReferenceRef\n  }), [position.refs, setReference, setPositionReference]);\n  const elements = React.useMemo(() => ({\n    ...position.elements,\n    domReference: domReference\n  }), [position.elements, domReference]);\n  const context = React.useMemo(() => ({\n    ...position,\n    ...rootContext,\n    refs,\n    elements,\n    nodeId\n  }), [position, refs, elements, nodeId, rootContext]);\n  index(() => {\n    rootContext.dataRef.current.floatingContext = context;\n    const node = tree == null ? void 0 : tree.nodesRef.current.find(node => node.id === nodeId);\n    if (node) {\n      node.context = context;\n    }\n  });\n  return React.useMemo(() => ({\n    ...position,\n    context,\n    refs,\n    elements\n  }), [position, refs, elements, context]);\n}\n\n/**\n * Opens the floating element while the reference element has focus, like CSS\n * `:focus`.\n * @see https://floating-ui.com/docs/useFocus\n */\nfunction useFocus(context, props) {\n  if (props === void 0) {\n    props = {};\n  }\n  const {\n    open,\n    onOpenChange,\n    events,\n    dataRef,\n    elements: {\n      domReference\n    }\n  } = context;\n  const {\n    enabled = true,\n    visibleOnly = true\n  } = props;\n  const blockFocusRef = React.useRef(false);\n  const timeoutRef = React.useRef();\n  const keyboardModalityRef = React.useRef(true);\n  React.useEffect(() => {\n    if (!enabled) {\n      return;\n    }\n    const win = getWindow(domReference);\n\n    // If the reference was focused and the user left the tab/window, and the\n    // floating element was not open, the focus should be blocked when they\n    // return to the tab/window.\n    function onBlur() {\n      if (!open && isHTMLElement(domReference) && domReference === activeElement(getDocument(domReference))) {\n        blockFocusRef.current = true;\n      }\n    }\n    function onKeyDown() {\n      keyboardModalityRef.current = true;\n    }\n    win.addEventListener('blur', onBlur);\n    win.addEventListener('keydown', onKeyDown, true);\n    return () => {\n      win.removeEventListener('blur', onBlur);\n      win.removeEventListener('keydown', onKeyDown, true);\n    };\n  }, [domReference, open, enabled]);\n  React.useEffect(() => {\n    if (!enabled) {\n      return;\n    }\n    function onOpenChange(_ref) {\n      let {\n        reason\n      } = _ref;\n      if (reason === 'reference-press' || reason === 'escape-key') {\n        blockFocusRef.current = true;\n      }\n    }\n    events.on('openchange', onOpenChange);\n    return () => {\n      events.off('openchange', onOpenChange);\n    };\n  }, [events, enabled]);\n  React.useEffect(() => {\n    return () => {\n      clearTimeout(timeoutRef.current);\n    };\n  }, []);\n  return React.useMemo(() => {\n    if (!enabled) {\n      return {};\n    }\n    return {\n      reference: {\n        onPointerDown(event) {\n          if (isVirtualPointerEvent(event.nativeEvent)) return;\n          keyboardModalityRef.current = false;\n        },\n        onMouseLeave() {\n          blockFocusRef.current = false;\n        },\n        onFocus(event) {\n          if (blockFocusRef.current) return;\n          const target = getTarget(event.nativeEvent);\n          if (visibleOnly && isElement(target)) {\n            try {\n              // Mac Safari unreliably matches `:focus-visible` on the reference\n              // if focus was outside the page initially - use the fallback\n              // instead.\n              if (isSafari() && isMac()) throw Error();\n              if (!target.matches(':focus-visible')) return;\n            } catch (e) {\n              // Old browsers will throw an error when using `:focus-visible`.\n              if (!keyboardModalityRef.current && !isTypeableElement(target)) {\n                return;\n              }\n            }\n          }\n          onOpenChange(true, event.nativeEvent, 'focus');\n        },\n        onBlur(event) {\n          blockFocusRef.current = false;\n          const relatedTarget = event.relatedTarget;\n\n          // Hit the non-modal focus management portal guard. Focus will be\n          // moved into the floating element immediately after.\n          const movedToFocusGuard = isElement(relatedTarget) && relatedTarget.hasAttribute(createAttribute('focus-guard')) && relatedTarget.getAttribute('data-type') === 'outside';\n\n          // Wait for the window blur listener to fire.\n          timeoutRef.current = window.setTimeout(() => {\n            var _dataRef$current$floa;\n            const activeEl = activeElement(domReference ? domReference.ownerDocument : document);\n\n            // Focus left the page, keep it open.\n            if (!relatedTarget && activeEl === domReference) return;\n\n            // When focusing the reference element (e.g. regular click), then\n            // clicking into the floating element, prevent it from hiding.\n            // Note: it must be focusable, e.g. `tabindex=\"-1\"`.\n            // We can not rely on relatedTarget to point to the correct element\n            // as it will only point to the shadow host of the newly focused element\n            // and not the element that actually has received focus if it is located\n            // inside a shadow root.\n            if (contains((_dataRef$current$floa = dataRef.current.floatingContext) == null ? void 0 : _dataRef$current$floa.refs.floating.current, activeEl) || contains(domReference, activeEl) || movedToFocusGuard) {\n              return;\n            }\n            onOpenChange(false, event.nativeEvent, 'focus');\n          });\n        }\n      }\n    };\n  }, [enabled, visibleOnly, dataRef, domReference, onOpenChange]);\n}\n\nconst ACTIVE_KEY = 'active';\nconst SELECTED_KEY = 'selected';\nfunction mergeProps(userProps, propsList, elementKey) {\n  const map = new Map();\n  const isItem = elementKey === 'item';\n  let domUserProps = userProps;\n  if (isItem && userProps) {\n    const {\n      [ACTIVE_KEY]: _,\n      [SELECTED_KEY]: __,\n      ...validProps\n    } = userProps;\n    domUserProps = validProps;\n  }\n  return {\n    ...(elementKey === 'floating' && {\n      tabIndex: -1\n    }),\n    ...domUserProps,\n    ...propsList.map(value => {\n      const propsOrGetProps = value ? value[elementKey] : null;\n      if (typeof propsOrGetProps === 'function') {\n        return userProps ? propsOrGetProps(userProps) : null;\n      }\n      return propsOrGetProps;\n    }).concat(userProps).reduce((acc, props) => {\n      if (!props) {\n        return acc;\n      }\n      Object.entries(props).forEach(_ref => {\n        let [key, value] = _ref;\n        if (isItem && [ACTIVE_KEY, SELECTED_KEY].includes(key)) {\n          return;\n        }\n        if (key.indexOf('on') === 0) {\n          if (!map.has(key)) {\n            map.set(key, []);\n          }\n          if (typeof value === 'function') {\n            var _map$get;\n            (_map$get = map.get(key)) == null || _map$get.push(value);\n            acc[key] = function () {\n              var _map$get2;\n              for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n                args[_key] = arguments[_key];\n              }\n              return (_map$get2 = map.get(key)) == null ? void 0 : _map$get2.map(fn => fn(...args)).find(val => val !== undefined);\n            };\n          }\n        } else {\n          acc[key] = value;\n        }\n      });\n      return acc;\n    }, {})\n  };\n}\n/**\n * Merges an array of interaction hooks' props into prop getters, allowing\n * event handler functions to be composed together without overwriting one\n * another.\n * @see https://floating-ui.com/docs/useInteractions\n */\nfunction useInteractions(propsList) {\n  if (propsList === void 0) {\n    propsList = [];\n  }\n  // The dependencies are a dynamic array, so we can't use the linter's\n  // suggestion to add it to the deps array.\n  const deps = propsList;\n  const getReferenceProps = React.useCallback(userProps => mergeProps(userProps, propsList, 'reference'),\n  // eslint-disable-next-line react-hooks/exhaustive-deps\n  deps);\n  const getFloatingProps = React.useCallback(userProps => mergeProps(userProps, propsList, 'floating'),\n  // eslint-disable-next-line react-hooks/exhaustive-deps\n  deps);\n  const getItemProps = React.useCallback(userProps => mergeProps(userProps, propsList, 'item'),\n  // Granularly check for `item` changes, because the `getItemProps` getter\n  // should be as referentially stable as possible since it may be passed as\n  // a prop to many components. All `item` key values must therefore be\n  // memoized.\n  // eslint-disable-next-line react-hooks/exhaustive-deps\n  propsList.map(key => key == null ? void 0 : key.item));\n  return React.useMemo(() => ({\n    getReferenceProps,\n    getFloatingProps,\n    getItemProps\n  }), [getReferenceProps, getFloatingProps, getItemProps]);\n}\n\nlet isPreventScrollSupported = false;\nfunction doSwitch(orientation, vertical, horizontal) {\n  switch (orientation) {\n    case 'vertical':\n      return vertical;\n    case 'horizontal':\n      return horizontal;\n    default:\n      return vertical || horizontal;\n  }\n}\nfunction isMainOrientationKey(key, orientation) {\n  const vertical = key === ARROW_UP || key === ARROW_DOWN;\n  const horizontal = key === ARROW_LEFT || key === ARROW_RIGHT;\n  return doSwitch(orientation, vertical, horizontal);\n}\nfunction isMainOrientationToEndKey(key, orientation, rtl) {\n  const vertical = key === ARROW_DOWN;\n  const horizontal = rtl ? key === ARROW_LEFT : key === ARROW_RIGHT;\n  return doSwitch(orientation, vertical, horizontal) || key === 'Enter' || key === ' ' || key === '';\n}\nfunction isCrossOrientationOpenKey(key, orientation, rtl) {\n  const vertical = rtl ? key === ARROW_LEFT : key === ARROW_RIGHT;\n  const horizontal = key === ARROW_DOWN;\n  return doSwitch(orientation, vertical, horizontal);\n}\nfunction isCrossOrientationCloseKey(key, orientation, rtl) {\n  const vertical = rtl ? key === ARROW_RIGHT : key === ARROW_LEFT;\n  const horizontal = key === ARROW_UP;\n  return doSwitch(orientation, vertical, horizontal);\n}\n/**\n * Adds arrow key-based navigation of a list of items, either using real DOM\n * focus or virtual focus.\n * @see https://floating-ui.com/docs/useListNavigation\n */\nfunction useListNavigation(context, props) {\n  const {\n    open,\n    onOpenChange,\n    elements: {\n      domReference,\n      floating\n    }\n  } = context;\n  const {\n    listRef,\n    activeIndex,\n    onNavigate: unstable_onNavigate = () => {},\n    enabled = true,\n    selectedIndex = null,\n    allowEscape = false,\n    loop = false,\n    nested = false,\n    rtl = false,\n    virtual = false,\n    focusItemOnOpen = 'auto',\n    focusItemOnHover = true,\n    openOnArrowKeyDown = true,\n    disabledIndices = undefined,\n    orientation = 'vertical',\n    cols = 1,\n    scrollItemIntoView = true,\n    virtualItemRef,\n    itemSizes,\n    dense = false\n  } = props;\n  if (process.env.NODE_ENV !== \"production\") {\n    if (allowEscape) {\n      if (!loop) {\n        warn('`useListNavigation` looping must be enabled to allow escaping.');\n      }\n      if (!virtual) {\n        warn('`useListNavigation` must be virtual to allow escaping.');\n      }\n    }\n    if (orientation === 'vertical' && cols > 1) {\n      warn('In grid list navigation mode (`cols` > 1), the `orientation` should', 'be either \"horizontal\" or \"both\".');\n    }\n  }\n  const parentId = useFloatingParentNodeId();\n  const tree = useFloatingTree();\n  const onNavigate = useEffectEvent(unstable_onNavigate);\n  const focusItemOnOpenRef = React.useRef(focusItemOnOpen);\n  const indexRef = React.useRef(selectedIndex != null ? selectedIndex : -1);\n  const keyRef = React.useRef(null);\n  const isPointerModalityRef = React.useRef(true);\n  const previousOnNavigateRef = React.useRef(onNavigate);\n  const previousMountedRef = React.useRef(!!floating);\n  const forceSyncFocus = React.useRef(false);\n  const forceScrollIntoViewRef = React.useRef(false);\n  const disabledIndicesRef = useLatestRef(disabledIndices);\n  const latestOpenRef = useLatestRef(open);\n  const scrollItemIntoViewRef = useLatestRef(scrollItemIntoView);\n  const floatingRef = useLatestRef(floating);\n  const selectedIndexRef = useLatestRef(selectedIndex);\n  const [activeId, setActiveId] = React.useState();\n  const [virtualId, setVirtualId] = React.useState();\n  const focusItem = useEffectEvent(function (listRef, indexRef, forceScrollIntoView) {\n    if (forceScrollIntoView === void 0) {\n      forceScrollIntoView = false;\n    }\n    function runFocus(item) {\n      if (virtual) {\n        setActiveId(item.id);\n        tree == null || tree.events.emit('virtualfocus', item);\n        if (virtualItemRef) {\n          virtualItemRef.current = item;\n        }\n      } else {\n        enqueueFocus(item, {\n          preventScroll: true,\n          // Mac Safari does not move the virtual cursor unless the focus call\n          // is sync. However, for the very first focus call, we need to wait\n          // for the position to be ready in order to prevent unwanted\n          // scrolling. This means the virtual cursor will not move to the first\n          // item when first opening the floating element, but will on\n          // subsequent calls. `preventScroll` is supported in modern Safari,\n          // so we can use that instead.\n          // iOS Safari must be async or the first item will not be focused.\n          sync: isMac() && isSafari() ? isPreventScrollSupported || forceSyncFocus.current : false\n        });\n      }\n    }\n    const initialItem = listRef.current[indexRef.current];\n    if (initialItem) {\n      runFocus(initialItem);\n    }\n    requestAnimationFrame(() => {\n      const waitedItem = listRef.current[indexRef.current] || initialItem;\n      if (!waitedItem) return;\n      if (!initialItem) {\n        runFocus(waitedItem);\n      }\n      const scrollIntoViewOptions = scrollItemIntoViewRef.current;\n      const shouldScrollIntoView = scrollIntoViewOptions && item && (forceScrollIntoView || !isPointerModalityRef.current);\n      if (shouldScrollIntoView) {\n        // JSDOM doesn't support `.scrollIntoView()` but it's widely supported\n        // by all browsers.\n        waitedItem.scrollIntoView == null || waitedItem.scrollIntoView(typeof scrollIntoViewOptions === 'boolean' ? {\n          block: 'nearest',\n          inline: 'nearest'\n        } : scrollIntoViewOptions);\n      }\n    });\n  });\n  index(() => {\n    document.createElement('div').focus({\n      get preventScroll() {\n        isPreventScrollSupported = true;\n        return false;\n      }\n    });\n  }, []);\n\n  // Sync `selectedIndex` to be the `activeIndex` upon opening the floating\n  // element. Also, reset `activeIndex` upon closing the floating element.\n  index(() => {\n    if (!enabled) {\n      return;\n    }\n    if (open && floating) {\n      if (focusItemOnOpenRef.current && selectedIndex != null) {\n        // Regardless of the pointer modality, we want to ensure the selected\n        // item comes into view when the floating element is opened.\n        forceScrollIntoViewRef.current = true;\n        indexRef.current = selectedIndex;\n        onNavigate(selectedIndex);\n      }\n    } else if (previousMountedRef.current) {\n      // Since the user can specify `onNavigate` conditionally\n      // (onNavigate: open ? setActiveIndex : setSelectedIndex),\n      // we store and call the previous function.\n      indexRef.current = -1;\n      previousOnNavigateRef.current(null);\n    }\n  }, [enabled, open, floating, selectedIndex, onNavigate]);\n\n  // Sync `activeIndex` to be the focused item while the floating element is\n  // open.\n  index(() => {\n    if (!enabled) {\n      return;\n    }\n    if (open && floating) {\n      if (activeIndex == null) {\n        forceSyncFocus.current = false;\n        if (selectedIndexRef.current != null) {\n          return;\n        }\n\n        // Reset while the floating element was open (e.g. the list changed).\n        if (previousMountedRef.current) {\n          indexRef.current = -1;\n          focusItem(listRef, indexRef);\n        }\n\n        // Initial sync.\n        if (!previousMountedRef.current && focusItemOnOpenRef.current && (keyRef.current != null || focusItemOnOpenRef.current === true && keyRef.current == null)) {\n          let runs = 0;\n          const waitForListPopulated = () => {\n            if (listRef.current[0] == null) {\n              // Avoid letting the browser paint if possible on the first try,\n              // otherwise use rAF. Don't try more than twice, since something\n              // is wrong otherwise.\n              if (runs < 2) {\n                const scheduler = runs ? requestAnimationFrame : queueMicrotask;\n                scheduler(waitForListPopulated);\n              }\n              runs++;\n            } else {\n              indexRef.current = keyRef.current == null || isMainOrientationToEndKey(keyRef.current, orientation, rtl) || nested ? getMinIndex(listRef, disabledIndicesRef.current) : getMaxIndex(listRef, disabledIndicesRef.current);\n              keyRef.current = null;\n              onNavigate(indexRef.current);\n            }\n          };\n          waitForListPopulated();\n        }\n      } else if (!isIndexOutOfBounds(listRef, activeIndex)) {\n        indexRef.current = activeIndex;\n        focusItem(listRef, indexRef, forceScrollIntoViewRef.current);\n        forceScrollIntoViewRef.current = false;\n      }\n    }\n  }, [enabled, open, floating, activeIndex, selectedIndexRef, nested, listRef, orientation, rtl, onNavigate, focusItem, disabledIndicesRef]);\n\n  // Ensure the parent floating element has focus when a nested child closes\n  // to allow arrow key navigation to work after the pointer leaves the child.\n  index(() => {\n    var _nodes$find;\n    if (!enabled || floating || !tree || virtual || !previousMountedRef.current) {\n      return;\n    }\n    const nodes = tree.nodesRef.current;\n    const parent = (_nodes$find = nodes.find(node => node.id === parentId)) == null || (_nodes$find = _nodes$find.context) == null ? void 0 : _nodes$find.elements.floating;\n    const activeEl = activeElement(getDocument(floating));\n    const treeContainsActiveEl = nodes.some(node => node.context && contains(node.context.elements.floating, activeEl));\n    if (parent && !treeContainsActiveEl && isPointerModalityRef.current) {\n      parent.focus({\n        preventScroll: true\n      });\n    }\n  }, [enabled, floating, tree, parentId, virtual]);\n  index(() => {\n    if (!enabled || !tree || !virtual || parentId) return;\n    function handleVirtualFocus(item) {\n      setVirtualId(item.id);\n      if (virtualItemRef) {\n        virtualItemRef.current = item;\n      }\n    }\n    tree.events.on('virtualfocus', handleVirtualFocus);\n    return () => {\n      tree.events.off('virtualfocus', handleVirtualFocus);\n    };\n  }, [enabled, tree, virtual, parentId, virtualItemRef]);\n  index(() => {\n    previousOnNavigateRef.current = onNavigate;\n    previousMountedRef.current = !!floating;\n  });\n  index(() => {\n    if (!open) {\n      keyRef.current = null;\n    }\n  }, [open]);\n  const hasActiveIndex = activeIndex != null;\n  const item = React.useMemo(() => {\n    function syncCurrentTarget(currentTarget) {\n      if (!open) return;\n      const index = listRef.current.indexOf(currentTarget);\n      if (index !== -1) {\n        onNavigate(index);\n      }\n    }\n    const props = {\n      onFocus(_ref) {\n        let {\n          currentTarget\n        } = _ref;\n        syncCurrentTarget(currentTarget);\n      },\n      onClick: _ref2 => {\n        let {\n          currentTarget\n        } = _ref2;\n        return currentTarget.focus({\n          preventScroll: true\n        });\n      },\n      // Safari\n      ...(focusItemOnHover && {\n        onMouseMove(_ref3) {\n          let {\n            currentTarget\n          } = _ref3;\n          syncCurrentTarget(currentTarget);\n        },\n        onPointerLeave(_ref4) {\n          let {\n            pointerType\n          } = _ref4;\n          if (!isPointerModalityRef.current || pointerType === 'touch') {\n            return;\n          }\n          indexRef.current = -1;\n          focusItem(listRef, indexRef);\n          onNavigate(null);\n          if (!virtual) {\n            enqueueFocus(floatingRef.current, {\n              preventScroll: true\n            });\n          }\n        }\n      })\n    };\n    return props;\n  }, [open, floatingRef, focusItem, focusItemOnHover, listRef, onNavigate, virtual]);\n  return React.useMemo(() => {\n    if (!enabled) {\n      return {};\n    }\n    const disabledIndices = disabledIndicesRef.current;\n    function onKeyDown(event) {\n      isPointerModalityRef.current = false;\n      forceSyncFocus.current = true;\n\n      // If the floating element is animating out, ignore navigation. Otherwise,\n      // the `activeIndex` gets set to 0 despite not being open so the next time\n      // the user ArrowDowns, the first item won't be focused.\n      if (!latestOpenRef.current && event.currentTarget === floatingRef.current) {\n        return;\n      }\n      if (nested && isCrossOrientationCloseKey(event.key, orientation, rtl)) {\n        stopEvent(event);\n        onOpenChange(false, event.nativeEvent, 'list-navigation');\n        if (isHTMLElement(domReference) && !virtual) {\n          domReference.focus();\n        }\n        return;\n      }\n      const currentIndex = indexRef.current;\n      const minIndex = getMinIndex(listRef, disabledIndices);\n      const maxIndex = getMaxIndex(listRef, disabledIndices);\n      if (event.key === 'Home') {\n        stopEvent(event);\n        indexRef.current = minIndex;\n        onNavigate(indexRef.current);\n      }\n      if (event.key === 'End') {\n        stopEvent(event);\n        indexRef.current = maxIndex;\n        onNavigate(indexRef.current);\n      }\n\n      // Grid navigation.\n      if (cols > 1) {\n        const sizes = itemSizes || Array.from({\n          length: listRef.current.length\n        }, () => ({\n          width: 1,\n          height: 1\n        }));\n        // To calculate movements on the grid, we use hypothetical cell indices\n        // as if every item was 1x1, then convert back to real indices.\n        const cellMap = buildCellMap(sizes, cols, dense);\n        const minGridIndex = cellMap.findIndex(index => index != null && !isDisabled(listRef.current, index, disabledIndices));\n        // last enabled index\n        const maxGridIndex = cellMap.reduce((foundIndex, index, cellIndex) => index != null && !isDisabled(listRef.current, index, disabledIndices) ? cellIndex : foundIndex, -1);\n        indexRef.current = cellMap[getGridNavigatedIndex({\n          current: cellMap.map(itemIndex => itemIndex != null ? listRef.current[itemIndex] : null)\n        }, {\n          event,\n          orientation,\n          loop,\n          cols,\n          // treat undefined (empty grid spaces) as disabled indices so we\n          // don't end up in them\n          disabledIndices: getCellIndices([...(disabledIndices || listRef.current.map((_, index) => isDisabled(listRef.current, index) ? index : undefined)), undefined], cellMap),\n          minIndex: minGridIndex,\n          maxIndex: maxGridIndex,\n          prevIndex: getCellIndexOfCorner(indexRef.current > maxIndex ? minIndex : indexRef.current, sizes, cellMap, cols,\n          // use a corner matching the edge closest to the direction\n          // we're moving in so we don't end up in the same item. Prefer\n          // top/left over bottom/right.\n          event.key === ARROW_DOWN ? 'bl' : event.key === ARROW_RIGHT ? 'tr' : 'tl'),\n          stopEvent: true\n        })]; // navigated cell will never be nullish\n\n        onNavigate(indexRef.current);\n        if (orientation === 'both') {\n          return;\n        }\n      }\n      if (isMainOrientationKey(event.key, orientation)) {\n        stopEvent(event);\n\n        // Reset the index if no item is focused.\n        if (open && !virtual && activeElement(event.currentTarget.ownerDocument) === event.currentTarget) {\n          indexRef.current = isMainOrientationToEndKey(event.key, orientation, rtl) ? minIndex : maxIndex;\n          onNavigate(indexRef.current);\n          return;\n        }\n        if (isMainOrientationToEndKey(event.key, orientation, rtl)) {\n          if (loop) {\n            indexRef.current = currentIndex >= maxIndex ? allowEscape && currentIndex !== listRef.current.length ? -1 : minIndex : findNonDisabledIndex(listRef, {\n              startingIndex: currentIndex,\n              disabledIndices\n            });\n          } else {\n            indexRef.current = Math.min(maxIndex, findNonDisabledIndex(listRef, {\n              startingIndex: currentIndex,\n              disabledIndices\n            }));\n          }\n        } else {\n          if (loop) {\n            indexRef.current = currentIndex <= minIndex ? allowEscape && currentIndex !== -1 ? listRef.current.length : maxIndex : findNonDisabledIndex(listRef, {\n              startingIndex: currentIndex,\n              decrement: true,\n              disabledIndices\n            });\n          } else {\n            indexRef.current = Math.max(minIndex, findNonDisabledIndex(listRef, {\n              startingIndex: currentIndex,\n              decrement: true,\n              disabledIndices\n            }));\n          }\n        }\n        if (isIndexOutOfBounds(listRef, indexRef.current)) {\n          onNavigate(null);\n        } else {\n          onNavigate(indexRef.current);\n        }\n      }\n    }\n    function checkVirtualMouse(event) {\n      if (focusItemOnOpen === 'auto' && isVirtualClick(event.nativeEvent)) {\n        focusItemOnOpenRef.current = true;\n      }\n    }\n    function checkVirtualPointer(event) {\n      // `pointerdown` fires first, reset the state then perform the checks.\n      focusItemOnOpenRef.current = focusItemOnOpen;\n      if (focusItemOnOpen === 'auto' && isVirtualPointerEvent(event.nativeEvent)) {\n        focusItemOnOpenRef.current = true;\n      }\n    }\n    const ariaActiveDescendantProp = virtual && open && hasActiveIndex && {\n      'aria-activedescendant': virtualId || activeId\n    };\n    const activeItem = listRef.current.find(item => (item == null ? void 0 : item.id) === activeId);\n    return {\n      reference: {\n        ...ariaActiveDescendantProp,\n        onKeyDown(event) {\n          isPointerModalityRef.current = false;\n          const isArrowKey = event.key.indexOf('Arrow') === 0;\n          const isCrossOpenKey = isCrossOrientationOpenKey(event.key, orientation, rtl);\n          const isCrossCloseKey = isCrossOrientationCloseKey(event.key, orientation, rtl);\n          const isMainKey = isMainOrientationKey(event.key, orientation);\n          const isNavigationKey = (nested ? isCrossOpenKey : isMainKey) || event.key === 'Enter' || event.key.trim() === '';\n          if (virtual && open) {\n            const rootNode = tree == null ? void 0 : tree.nodesRef.current.find(node => node.parentId == null);\n            const deepestNode = tree && rootNode ? getDeepestNode(tree.nodesRef.current, rootNode.id) : null;\n            if (isArrowKey && deepestNode && virtualItemRef) {\n              const eventObject = new KeyboardEvent('keydown', {\n                key: event.key,\n                bubbles: true\n              });\n              if (isCrossOpenKey || isCrossCloseKey) {\n                var _deepestNode$context, _deepestNode$context2;\n                const isCurrentTarget = ((_deepestNode$context = deepestNode.context) == null ? void 0 : _deepestNode$context.elements.domReference) === event.currentTarget;\n                const dispatchItem = isCrossCloseKey && !isCurrentTarget ? (_deepestNode$context2 = deepestNode.context) == null ? void 0 : _deepestNode$context2.elements.domReference : isCrossOpenKey ? activeItem : null;\n                if (dispatchItem) {\n                  stopEvent(event);\n                  dispatchItem.dispatchEvent(eventObject);\n                  setVirtualId(undefined);\n                }\n              }\n              if (isMainKey && deepestNode.context) {\n                if (deepestNode.context.open && deepestNode.parentId && event.currentTarget !== deepestNode.context.elements.domReference) {\n                  var _deepestNode$context$;\n                  stopEvent(event);\n                  (_deepestNode$context$ = deepestNode.context.elements.domReference) == null || _deepestNode$context$.dispatchEvent(eventObject);\n                  return;\n                }\n              }\n            }\n            return onKeyDown(event);\n          }\n\n          // If a floating element should not open on arrow key down, avoid\n          // setting `activeIndex` while it's closed.\n          if (!open && !openOnArrowKeyDown && isArrowKey) {\n            return;\n          }\n          if (isNavigationKey) {\n            keyRef.current = nested && isMainKey ? null : event.key;\n          }\n          if (nested) {\n            if (isCrossOpenKey) {\n              stopEvent(event);\n              if (open) {\n                indexRef.current = getMinIndex(listRef, disabledIndices);\n                onNavigate(indexRef.current);\n              } else {\n                onOpenChange(true, event.nativeEvent, 'list-navigation');\n              }\n            }\n            return;\n          }\n          if (isMainKey) {\n            if (selectedIndex != null) {\n              indexRef.current = selectedIndex;\n            }\n            stopEvent(event);\n            if (!open && openOnArrowKeyDown) {\n              onOpenChange(true, event.nativeEvent, 'list-navigation');\n            } else {\n              onKeyDown(event);\n            }\n            if (open) {\n              onNavigate(indexRef.current);\n            }\n          }\n        },\n        onFocus() {\n          if (open && !virtual) {\n            onNavigate(null);\n          }\n        },\n        onPointerDown: checkVirtualPointer,\n        onMouseDown: checkVirtualMouse,\n        onClick: checkVirtualMouse\n      },\n      floating: {\n        'aria-orientation': orientation === 'both' ? undefined : orientation,\n        ...(!isTypeableCombobox(domReference) && ariaActiveDescendantProp),\n        onKeyDown,\n        onPointerMove() {\n          isPointerModalityRef.current = true;\n        }\n      },\n      item\n    };\n  }, [domReference, floatingRef, activeId, virtualId, disabledIndicesRef, latestOpenRef, listRef, enabled, orientation, rtl, virtual, open, hasActiveIndex, nested, selectedIndex, openOnArrowKeyDown, allowEscape, cols, loop, focusItemOnOpen, onNavigate, onOpenChange, item, tree, virtualItemRef, itemSizes, dense]);\n}\n\nconst componentRoleToAriaRoleMap = /*#__PURE__*/new Map([['select', 'listbox'], ['combobox', 'listbox'], ['label', false]]);\n\n/**\n * Adds base screen reader props to the reference and floating elements for a\n * given floating element `role`.\n * @see https://floating-ui.com/docs/useRole\n */\nfunction useRole(context, props) {\n  var _componentRoleToAriaR;\n  if (props === void 0) {\n    props = {};\n  }\n  const {\n    open,\n    floatingId\n  } = context;\n  const {\n    enabled = true,\n    role = 'dialog'\n  } = props;\n  const ariaRole = (_componentRoleToAriaR = componentRoleToAriaRoleMap.get(role)) != null ? _componentRoleToAriaR : role;\n  const referenceId = useId();\n  const parentId = useFloatingParentNodeId();\n  const isNested = parentId != null;\n  return React.useMemo(() => {\n    if (!enabled) return {};\n    const floatingProps = {\n      id: floatingId,\n      ...(ariaRole && {\n        role: ariaRole\n      })\n    };\n    if (ariaRole === 'tooltip' || role === 'label') {\n      return {\n        reference: {\n          [\"aria-\" + (role === 'label' ? 'labelledby' : 'describedby')]: open ? floatingId : undefined\n        },\n        floating: floatingProps\n      };\n    }\n    return {\n      reference: {\n        'aria-expanded': open ? 'true' : 'false',\n        'aria-haspopup': ariaRole === 'alertdialog' ? 'dialog' : ariaRole,\n        'aria-controls': open ? floatingId : undefined,\n        ...(ariaRole === 'listbox' && {\n          role: 'combobox'\n        }),\n        ...(ariaRole === 'menu' && {\n          id: referenceId\n        }),\n        ...(ariaRole === 'menu' && isNested && {\n          role: 'menuitem'\n        }),\n        ...(role === 'select' && {\n          'aria-autocomplete': 'none'\n        }),\n        ...(role === 'combobox' && {\n          'aria-autocomplete': 'list'\n        })\n      },\n      floating: {\n        ...floatingProps,\n        ...(ariaRole === 'menu' && {\n          'aria-labelledby': referenceId\n        })\n      },\n      item(_ref) {\n        let {\n          active,\n          selected\n        } = _ref;\n        const commonProps = {\n          role: 'option',\n          ...(active && {\n            id: floatingId + \"-option\"\n          })\n        };\n\n        // For `menu`, we are unable to tell if the item is a `menuitemradio`\n        // or `menuitemcheckbox`. For backwards-compatibility reasons, also\n        // avoid defaulting to `menuitem` as it may overwrite custom role props.\n        switch (role) {\n          case 'select':\n            return {\n              ...commonProps,\n              'aria-selected': active && selected\n            };\n          case 'combobox':\n            {\n              return {\n                ...commonProps,\n                ...(active && {\n                  'aria-selected': true\n                })\n              };\n            }\n        }\n        return {};\n      }\n    };\n  }, [enabled, role, ariaRole, open, floatingId, referenceId, isNested]);\n}\n\n// Converts a JS style key like `backgroundColor` to a CSS transition-property\n// like `background-color`.\nconst camelCaseToKebabCase = str => str.replace(/[A-Z]+(?![a-z])|[A-Z]/g, ($, ofs) => (ofs ? '-' : '') + $.toLowerCase());\nfunction execWithArgsOrReturn(valueOrFn, args) {\n  return typeof valueOrFn === 'function' ? valueOrFn(args) : valueOrFn;\n}\nfunction useDelayUnmount(open, durationMs) {\n  const [isMounted, setIsMounted] = React.useState(open);\n  if (open && !isMounted) {\n    setIsMounted(true);\n  }\n  React.useEffect(() => {\n    if (!open && isMounted) {\n      const timeout = setTimeout(() => setIsMounted(false), durationMs);\n      return () => clearTimeout(timeout);\n    }\n  }, [open, isMounted, durationMs]);\n  return isMounted;\n}\n/**\n * Provides a status string to apply CSS transitions to a floating element,\n * correctly handling placement-aware transitions.\n * @see https://floating-ui.com/docs/useTransition#usetransitionstatus\n */\nfunction useTransitionStatus(context, props) {\n  if (props === void 0) {\n    props = {};\n  }\n  const {\n    open,\n    elements: {\n      floating\n    }\n  } = context;\n  const {\n    duration = 250\n  } = props;\n  const isNumberDuration = typeof duration === 'number';\n  const closeDuration = (isNumberDuration ? duration : duration.close) || 0;\n  const [status, setStatus] = React.useState('unmounted');\n  const isMounted = useDelayUnmount(open, closeDuration);\n  if (!isMounted && status === 'close') {\n    setStatus('unmounted');\n  }\n  index(() => {\n    if (!floating) return;\n    if (open) {\n      setStatus('initial');\n      const frame = requestAnimationFrame(() => {\n        setStatus('open');\n      });\n      return () => {\n        cancelAnimationFrame(frame);\n      };\n    }\n    setStatus('close');\n  }, [open, floating]);\n  return {\n    isMounted,\n    status\n  };\n}\n/**\n * Provides styles to apply CSS transitions to a floating element, correctly\n * handling placement-aware transitions. Wrapper around `useTransitionStatus`.\n * @see https://floating-ui.com/docs/useTransition#usetransitionstyles\n */\nfunction useTransitionStyles(context, props) {\n  if (props === void 0) {\n    props = {};\n  }\n  const {\n    initial: unstable_initial = {\n      opacity: 0\n    },\n    open: unstable_open,\n    close: unstable_close,\n    common: unstable_common,\n    duration = 250\n  } = props;\n  const placement = context.placement;\n  const side = placement.split('-')[0];\n  const fnArgs = React.useMemo(() => ({\n    side,\n    placement\n  }), [side, placement]);\n  const isNumberDuration = typeof duration === 'number';\n  const openDuration = (isNumberDuration ? duration : duration.open) || 0;\n  const closeDuration = (isNumberDuration ? duration : duration.close) || 0;\n  const [styles, setStyles] = React.useState(() => ({\n    ...execWithArgsOrReturn(unstable_common, fnArgs),\n    ...execWithArgsOrReturn(unstable_initial, fnArgs)\n  }));\n  const {\n    isMounted,\n    status\n  } = useTransitionStatus(context, {\n    duration\n  });\n  const initialRef = useLatestRef(unstable_initial);\n  const openRef = useLatestRef(unstable_open);\n  const closeRef = useLatestRef(unstable_close);\n  const commonRef = useLatestRef(unstable_common);\n  index(() => {\n    const initialStyles = execWithArgsOrReturn(initialRef.current, fnArgs);\n    const closeStyles = execWithArgsOrReturn(closeRef.current, fnArgs);\n    const commonStyles = execWithArgsOrReturn(commonRef.current, fnArgs);\n    const openStyles = execWithArgsOrReturn(openRef.current, fnArgs) || Object.keys(initialStyles).reduce((acc, key) => {\n      acc[key] = '';\n      return acc;\n    }, {});\n    if (status === 'initial') {\n      setStyles(styles => ({\n        transitionProperty: styles.transitionProperty,\n        ...commonStyles,\n        ...initialStyles\n      }));\n    }\n    if (status === 'open') {\n      setStyles({\n        transitionProperty: Object.keys(openStyles).map(camelCaseToKebabCase).join(','),\n        transitionDuration: openDuration + \"ms\",\n        ...commonStyles,\n        ...openStyles\n      });\n    }\n    if (status === 'close') {\n      const styles = closeStyles || initialStyles;\n      setStyles({\n        transitionProperty: Object.keys(styles).map(camelCaseToKebabCase).join(','),\n        transitionDuration: closeDuration + \"ms\",\n        ...commonStyles,\n        ...styles\n      });\n    }\n  }, [closeDuration, closeRef, initialRef, openRef, commonRef, openDuration, status, fnArgs]);\n  return {\n    isMounted,\n    styles\n  };\n}\n\n/**\n * Provides a matching callback that can be used to focus an item as the user\n * types, often used in tandem with `useListNavigation()`.\n * @see https://floating-ui.com/docs/useTypeahead\n */\nfunction useTypeahead(context, props) {\n  var _ref;\n  const {\n    open,\n    dataRef\n  } = context;\n  const {\n    listRef,\n    activeIndex,\n    onMatch: unstable_onMatch,\n    onTypingChange: unstable_onTypingChange,\n    enabled = true,\n    findMatch = null,\n    resetMs = 750,\n    ignoreKeys = [],\n    selectedIndex = null\n  } = props;\n  const timeoutIdRef = React.useRef();\n  const stringRef = React.useRef('');\n  const prevIndexRef = React.useRef((_ref = selectedIndex != null ? selectedIndex : activeIndex) != null ? _ref : -1);\n  const matchIndexRef = React.useRef(null);\n  const onMatch = useEffectEvent(unstable_onMatch);\n  const onTypingChange = useEffectEvent(unstable_onTypingChange);\n  const findMatchRef = useLatestRef(findMatch);\n  const ignoreKeysRef = useLatestRef(ignoreKeys);\n  index(() => {\n    if (open) {\n      clearTimeout(timeoutIdRef.current);\n      matchIndexRef.current = null;\n      stringRef.current = '';\n    }\n  }, [open]);\n  index(() => {\n    // Sync arrow key navigation but not typeahead navigation.\n    if (open && stringRef.current === '') {\n      var _ref2;\n      prevIndexRef.current = (_ref2 = selectedIndex != null ? selectedIndex : activeIndex) != null ? _ref2 : -1;\n    }\n  }, [open, selectedIndex, activeIndex]);\n  return React.useMemo(() => {\n    if (!enabled) {\n      return {};\n    }\n    function setTypingChange(value) {\n      if (value) {\n        if (!dataRef.current.typing) {\n          dataRef.current.typing = value;\n          onTypingChange(value);\n        }\n      } else {\n        if (dataRef.current.typing) {\n          dataRef.current.typing = value;\n          onTypingChange(value);\n        }\n      }\n    }\n    function getMatchingIndex(list, orderedList, string) {\n      const str = findMatchRef.current ? findMatchRef.current(orderedList, string) : orderedList.find(text => (text == null ? void 0 : text.toLocaleLowerCase().indexOf(string.toLocaleLowerCase())) === 0);\n      return str ? list.indexOf(str) : -1;\n    }\n    function onKeyDown(event) {\n      const listContent = listRef.current;\n      if (stringRef.current.length > 0 && stringRef.current[0] !== ' ') {\n        if (getMatchingIndex(listContent, listContent, stringRef.current) === -1) {\n          setTypingChange(false);\n        } else if (event.key === ' ') {\n          stopEvent(event);\n        }\n      }\n      if (listContent == null || ignoreKeysRef.current.includes(event.key) ||\n      // Character key.\n      event.key.length !== 1 ||\n      // Modifier key.\n      event.ctrlKey || event.metaKey || event.altKey) {\n        return;\n      }\n      if (open && event.key !== ' ') {\n        stopEvent(event);\n        setTypingChange(true);\n      }\n\n      // Bail out if the list contains a word like \"llama\" or \"aaron\". TODO:\n      // allow it in this case, too.\n      const allowRapidSuccessionOfFirstLetter = listContent.every(text => {\n        var _text$, _text$2;\n        return text ? ((_text$ = text[0]) == null ? void 0 : _text$.toLocaleLowerCase()) !== ((_text$2 = text[1]) == null ? void 0 : _text$2.toLocaleLowerCase()) : true;\n      });\n\n      // Allows the user to cycle through items that start with the same letter\n      // in rapid succession.\n      if (allowRapidSuccessionOfFirstLetter && stringRef.current === event.key) {\n        stringRef.current = '';\n        prevIndexRef.current = matchIndexRef.current;\n      }\n      stringRef.current += event.key;\n      clearTimeout(timeoutIdRef.current);\n      timeoutIdRef.current = setTimeout(() => {\n        stringRef.current = '';\n        prevIndexRef.current = matchIndexRef.current;\n        setTypingChange(false);\n      }, resetMs);\n      const prevIndex = prevIndexRef.current;\n      const index = getMatchingIndex(listContent, [...listContent.slice((prevIndex || 0) + 1), ...listContent.slice(0, (prevIndex || 0) + 1)], stringRef.current);\n      if (index !== -1) {\n        onMatch(index);\n        matchIndexRef.current = index;\n      } else if (event.key !== ' ') {\n        stringRef.current = '';\n        setTypingChange(false);\n      }\n    }\n    return {\n      reference: {\n        onKeyDown\n      },\n      floating: {\n        onKeyDown,\n        onKeyUp(event) {\n          if (event.key === ' ') {\n            setTypingChange(false);\n          }\n        }\n      }\n    };\n  }, [enabled, open, dataRef, listRef, resetMs, ignoreKeysRef, findMatchRef, onMatch, onTypingChange]);\n}\n\nfunction getArgsWithCustomFloatingHeight(state, height) {\n  return {\n    ...state,\n    rects: {\n      ...state.rects,\n      floating: {\n        ...state.rects.floating,\n        height\n      }\n    }\n  };\n}\n/**\n * Positions the floating element such that an inner element inside\n * of it is anchored to the reference element.\n * @see https://floating-ui.com/docs/inner\n */\nconst inner = props => ({\n  name: 'inner',\n  options: props,\n  async fn(state) {\n    const {\n      listRef,\n      overflowRef,\n      onFallbackChange,\n      offset: innerOffset = 0,\n      index = 0,\n      minItemsVisible = 4,\n      referenceOverflowThreshold = 0,\n      scrollRef,\n      ...detectOverflowOptions\n    } = props;\n    const {\n      rects,\n      elements: {\n        floating\n      }\n    } = state;\n    const item = listRef.current[index];\n    if (process.env.NODE_ENV !== \"production\") {\n      if (!state.placement.startsWith('bottom')) {\n        warn('`placement` side must be \"bottom\" when using the `inner`', 'middleware.');\n      }\n    }\n    if (!item) {\n      return {};\n    }\n    const nextArgs = {\n      ...state,\n      ...(await offset(-item.offsetTop - floating.clientTop - rects.reference.height / 2 - item.offsetHeight / 2 - innerOffset).fn(state))\n    };\n    const el = (scrollRef == null ? void 0 : scrollRef.current) || floating;\n    const overflow = await detectOverflow(getArgsWithCustomFloatingHeight(nextArgs, el.scrollHeight), detectOverflowOptions);\n    const refOverflow = await detectOverflow(nextArgs, {\n      ...detectOverflowOptions,\n      elementContext: 'reference'\n    });\n    const diffY = Math.max(0, overflow.top);\n    const nextY = nextArgs.y + diffY;\n    const maxHeight = Math.max(0, el.scrollHeight - diffY - Math.max(0, overflow.bottom));\n    el.style.maxHeight = maxHeight + \"px\";\n    el.scrollTop = diffY;\n\n    // There is not enough space, fallback to standard anchored positioning\n    if (onFallbackChange) {\n      if (el.offsetHeight < item.offsetHeight * Math.min(minItemsVisible, listRef.current.length - 1) - 1 || refOverflow.top >= -referenceOverflowThreshold || refOverflow.bottom >= -referenceOverflowThreshold) {\n        flushSync(() => onFallbackChange(true));\n      } else {\n        flushSync(() => onFallbackChange(false));\n      }\n    }\n    if (overflowRef) {\n      overflowRef.current = await detectOverflow(getArgsWithCustomFloatingHeight({\n        ...nextArgs,\n        y: nextY\n      }, el.offsetHeight), detectOverflowOptions);\n    }\n    return {\n      y: nextY\n    };\n  }\n});\n/**\n * Changes the `inner` middleware's `offset` upon a `wheel` event to\n * expand the floating element's height, revealing more list items.\n * @see https://floating-ui.com/docs/inner\n */\nfunction useInnerOffset(context, props) {\n  const {\n    open,\n    elements\n  } = context;\n  const {\n    enabled = true,\n    overflowRef,\n    scrollRef,\n    onChange: unstable_onChange\n  } = props;\n  const onChange = useEffectEvent(unstable_onChange);\n  const controlledScrollingRef = React.useRef(false);\n  const prevScrollTopRef = React.useRef(null);\n  const initialOverflowRef = React.useRef(null);\n  React.useEffect(() => {\n    if (!enabled) {\n      return;\n    }\n    function onWheel(e) {\n      if (e.ctrlKey || !el || overflowRef.current == null) {\n        return;\n      }\n      const dY = e.deltaY;\n      const isAtTop = overflowRef.current.top >= -0.5;\n      const isAtBottom = overflowRef.current.bottom >= -0.5;\n      const remainingScroll = el.scrollHeight - el.clientHeight;\n      const sign = dY < 0 ? -1 : 1;\n      const method = dY < 0 ? 'max' : 'min';\n      if (el.scrollHeight <= el.clientHeight) {\n        return;\n      }\n      if (!isAtTop && dY > 0 || !isAtBottom && dY < 0) {\n        e.preventDefault();\n        flushSync(() => {\n          onChange(d => d + Math[method](dY, remainingScroll * sign));\n        });\n      } else if (/firefox/i.test(getUserAgent())) {\n        // Needed to propagate scrolling during momentum scrolling phase once\n        // it gets limited by the boundary. UX improvement, not critical.\n        el.scrollTop += dY;\n      }\n    }\n    const el = (scrollRef == null ? void 0 : scrollRef.current) || elements.floating;\n    if (open && el) {\n      el.addEventListener('wheel', onWheel);\n\n      // Wait for the position to be ready.\n      requestAnimationFrame(() => {\n        prevScrollTopRef.current = el.scrollTop;\n        if (overflowRef.current != null) {\n          initialOverflowRef.current = {\n            ...overflowRef.current\n          };\n        }\n      });\n      return () => {\n        prevScrollTopRef.current = null;\n        initialOverflowRef.current = null;\n        el.removeEventListener('wheel', onWheel);\n      };\n    }\n  }, [enabled, open, elements.floating, overflowRef, scrollRef, onChange]);\n  return React.useMemo(() => {\n    if (!enabled) {\n      return {};\n    }\n    return {\n      floating: {\n        onKeyDown() {\n          controlledScrollingRef.current = true;\n        },\n        onWheel() {\n          controlledScrollingRef.current = false;\n        },\n        onPointerMove() {\n          controlledScrollingRef.current = false;\n        },\n        onScroll() {\n          const el = (scrollRef == null ? void 0 : scrollRef.current) || elements.floating;\n          if (!overflowRef.current || !el || !controlledScrollingRef.current) {\n            return;\n          }\n          if (prevScrollTopRef.current !== null) {\n            const scrollDiff = el.scrollTop - prevScrollTopRef.current;\n            if (overflowRef.current.bottom < -0.5 && scrollDiff < -1 || overflowRef.current.top < -0.5 && scrollDiff > 1) {\n              flushSync(() => onChange(d => d + scrollDiff));\n            }\n          }\n\n          // [Firefox] Wait for the height change to have been applied.\n          requestAnimationFrame(() => {\n            prevScrollTopRef.current = el.scrollTop;\n          });\n        }\n      }\n    };\n  }, [enabled, overflowRef, elements.floating, scrollRef, onChange]);\n}\n\nfunction isPointInPolygon(point, polygon) {\n  const [x, y] = point;\n  let isInside = false;\n  const length = polygon.length;\n  for (let i = 0, j = length - 1; i < length; j = i++) {\n    const [xi, yi] = polygon[i] || [0, 0];\n    const [xj, yj] = polygon[j] || [0, 0];\n    const intersect = yi >= y !== yj >= y && x <= (xj - xi) * (y - yi) / (yj - yi) + xi;\n    if (intersect) {\n      isInside = !isInside;\n    }\n  }\n  return isInside;\n}\nfunction isInside(point, rect) {\n  return point[0] >= rect.x && point[0] <= rect.x + rect.width && point[1] >= rect.y && point[1] <= rect.y + rect.height;\n}\n/**\n * Generates a safe polygon area that the user can traverse without closing the\n * floating element once leaving the reference element.\n * @see https://floating-ui.com/docs/useHover#safepolygon\n */\nfunction safePolygon(options) {\n  if (options === void 0) {\n    options = {};\n  }\n  const {\n    buffer = 0.5,\n    blockPointerEvents = false,\n    requireIntent = true\n  } = options;\n  let timeoutId;\n  let hasLanded = false;\n  let lastX = null;\n  let lastY = null;\n  let lastCursorTime = performance.now();\n  function getCursorSpeed(x, y) {\n    const currentTime = performance.now();\n    const elapsedTime = currentTime - lastCursorTime;\n    if (lastX === null || lastY === null || elapsedTime === 0) {\n      lastX = x;\n      lastY = y;\n      lastCursorTime = currentTime;\n      return null;\n    }\n    const deltaX = x - lastX;\n    const deltaY = y - lastY;\n    const distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);\n    const speed = distance / elapsedTime; // px / ms\n\n    lastX = x;\n    lastY = y;\n    lastCursorTime = currentTime;\n    return speed;\n  }\n  const fn = _ref => {\n    let {\n      x,\n      y,\n      placement,\n      elements,\n      onClose,\n      nodeId,\n      tree\n    } = _ref;\n    return function onMouseMove(event) {\n      function close() {\n        clearTimeout(timeoutId);\n        onClose();\n      }\n      clearTimeout(timeoutId);\n      if (!elements.domReference || !elements.floating || placement == null || x == null || y == null) {\n        return;\n      }\n      const {\n        clientX,\n        clientY\n      } = event;\n      const clientPoint = [clientX, clientY];\n      const target = getTarget(event);\n      const isLeave = event.type === 'mouseleave';\n      const isOverFloatingEl = contains(elements.floating, target);\n      const isOverReferenceEl = contains(elements.domReference, target);\n      const refRect = elements.domReference.getBoundingClientRect();\n      const rect = elements.floating.getBoundingClientRect();\n      const side = placement.split('-')[0];\n      const cursorLeaveFromRight = x > rect.right - rect.width / 2;\n      const cursorLeaveFromBottom = y > rect.bottom - rect.height / 2;\n      const isOverReferenceRect = isInside(clientPoint, refRect);\n      const isFloatingWider = rect.width > refRect.width;\n      const isFloatingTaller = rect.height > refRect.height;\n      const left = (isFloatingWider ? refRect : rect).left;\n      const right = (isFloatingWider ? refRect : rect).right;\n      const top = (isFloatingTaller ? refRect : rect).top;\n      const bottom = (isFloatingTaller ? refRect : rect).bottom;\n      if (isOverFloatingEl) {\n        hasLanded = true;\n        if (!isLeave) {\n          return;\n        }\n      }\n      if (isOverReferenceEl) {\n        hasLanded = false;\n      }\n      if (isOverReferenceEl && !isLeave) {\n        hasLanded = true;\n        return;\n      }\n\n      // Prevent overlapping floating element from being stuck in an open-close\n      // loop: https://github.com/floating-ui/floating-ui/issues/1910\n      if (isLeave && isElement(event.relatedTarget) && contains(elements.floating, event.relatedTarget)) {\n        return;\n      }\n\n      // If any nested child is open, abort.\n      if (tree && getChildren(tree.nodesRef.current, nodeId).some(_ref2 => {\n        let {\n          context\n        } = _ref2;\n        return context == null ? void 0 : context.open;\n      })) {\n        return;\n      }\n\n      // If the pointer is leaving from the opposite side, the \"buffer\" logic\n      // creates a point where the floating element remains open, but should be\n      // ignored.\n      // A constant of 1 handles floating point rounding errors.\n      if (side === 'top' && y >= refRect.bottom - 1 || side === 'bottom' && y <= refRect.top + 1 || side === 'left' && x >= refRect.right - 1 || side === 'right' && x <= refRect.left + 1) {\n        return close();\n      }\n\n      // Ignore when the cursor is within the rectangular trough between the\n      // two elements. Since the triangle is created from the cursor point,\n      // which can start beyond the ref element's edge, traversing back and\n      // forth from the ref to the floating element can cause it to close. This\n      // ensures it always remains open in that case.\n      let rectPoly = [];\n      switch (side) {\n        case 'top':\n          rectPoly = [[left, refRect.top + 1], [left, rect.bottom - 1], [right, rect.bottom - 1], [right, refRect.top + 1]];\n          break;\n        case 'bottom':\n          rectPoly = [[left, rect.top + 1], [left, refRect.bottom - 1], [right, refRect.bottom - 1], [right, rect.top + 1]];\n          break;\n        case 'left':\n          rectPoly = [[rect.right - 1, bottom], [rect.right - 1, top], [refRect.left + 1, top], [refRect.left + 1, bottom]];\n          break;\n        case 'right':\n          rectPoly = [[refRect.right - 1, bottom], [refRect.right - 1, top], [rect.left + 1, top], [rect.left + 1, bottom]];\n          break;\n      }\n      function getPolygon(_ref3) {\n        let [x, y] = _ref3;\n        switch (side) {\n          case 'top':\n            {\n              const cursorPointOne = [isFloatingWider ? x + buffer / 2 : cursorLeaveFromRight ? x + buffer * 4 : x - buffer * 4, y + buffer + 1];\n              const cursorPointTwo = [isFloatingWider ? x - buffer / 2 : cursorLeaveFromRight ? x + buffer * 4 : x - buffer * 4, y + buffer + 1];\n              const commonPoints = [[rect.left, cursorLeaveFromRight ? rect.bottom - buffer : isFloatingWider ? rect.bottom - buffer : rect.top], [rect.right, cursorLeaveFromRight ? isFloatingWider ? rect.bottom - buffer : rect.top : rect.bottom - buffer]];\n              return [cursorPointOne, cursorPointTwo, ...commonPoints];\n            }\n          case 'bottom':\n            {\n              const cursorPointOne = [isFloatingWider ? x + buffer / 2 : cursorLeaveFromRight ? x + buffer * 4 : x - buffer * 4, y - buffer];\n              const cursorPointTwo = [isFloatingWider ? x - buffer / 2 : cursorLeaveFromRight ? x + buffer * 4 : x - buffer * 4, y - buffer];\n              const commonPoints = [[rect.left, cursorLeaveFromRight ? rect.top + buffer : isFloatingWider ? rect.top + buffer : rect.bottom], [rect.right, cursorLeaveFromRight ? isFloatingWider ? rect.top + buffer : rect.bottom : rect.top + buffer]];\n              return [cursorPointOne, cursorPointTwo, ...commonPoints];\n            }\n          case 'left':\n            {\n              const cursorPointOne = [x + buffer + 1, isFloatingTaller ? y + buffer / 2 : cursorLeaveFromBottom ? y + buffer * 4 : y - buffer * 4];\n              const cursorPointTwo = [x + buffer + 1, isFloatingTaller ? y - buffer / 2 : cursorLeaveFromBottom ? y + buffer * 4 : y - buffer * 4];\n              const commonPoints = [[cursorLeaveFromBottom ? rect.right - buffer : isFloatingTaller ? rect.right - buffer : rect.left, rect.top], [cursorLeaveFromBottom ? isFloatingTaller ? rect.right - buffer : rect.left : rect.right - buffer, rect.bottom]];\n              return [...commonPoints, cursorPointOne, cursorPointTwo];\n            }\n          case 'right':\n            {\n              const cursorPointOne = [x - buffer, isFloatingTaller ? y + buffer / 2 : cursorLeaveFromBottom ? y + buffer * 4 : y - buffer * 4];\n              const cursorPointTwo = [x - buffer, isFloatingTaller ? y - buffer / 2 : cursorLeaveFromBottom ? y + buffer * 4 : y - buffer * 4];\n              const commonPoints = [[cursorLeaveFromBottom ? rect.left + buffer : isFloatingTaller ? rect.left + buffer : rect.right, rect.top], [cursorLeaveFromBottom ? isFloatingTaller ? rect.left + buffer : rect.right : rect.left + buffer, rect.bottom]];\n              return [cursorPointOne, cursorPointTwo, ...commonPoints];\n            }\n        }\n      }\n      if (isPointInPolygon([clientX, clientY], rectPoly)) {\n        return;\n      }\n      if (hasLanded && !isOverReferenceRect) {\n        return close();\n      }\n      if (!isLeave && requireIntent) {\n        const cursorSpeed = getCursorSpeed(event.clientX, event.clientY);\n        const cursorSpeedThreshold = 0.1;\n        if (cursorSpeed !== null && cursorSpeed < cursorSpeedThreshold) {\n          return close();\n        }\n      }\n      if (!isPointInPolygon([clientX, clientY], getPolygon([x, y]))) {\n        close();\n      } else if (!hasLanded && requireIntent) {\n        timeoutId = window.setTimeout(close, 40);\n      }\n    };\n  };\n  fn.__options = {\n    blockPointerEvents\n  };\n  return fn;\n}\n\nexport { Composite, CompositeItem, FloatingArrow, FloatingDelayGroup, FloatingFocusManager, FloatingList, FloatingNode, FloatingOverlay, FloatingPortal, FloatingTree, inner, safePolygon, useClick, useClientPoint, useDelayGroup, useDelayGroupContext, useDismiss, useFloating, useFloatingNodeId, useFloatingParentNodeId, useFloatingPortalNode, useFloatingRootContext, useFloatingTree, useFocus, useHover, useId, useInnerOffset, useInteractions, useListItem, useListNavigation, useMergeRefs, useRole, useTransitionStatus, useTransitionStyles, useTypeahead };\n","import{autoUpdate as Z,flip as ee,inner as te,offset as ne,shift as le,size as re,useFloating as oe,useInnerOffset as ie,useInteractions as se}from\"@floating-ui/react\";import*as j from\"react\";import{createContext as _,useCallback as ae,useContext as R,useMemo as v,useRef as ue,useState as E}from\"react\";import{useDisposables as fe}from'../hooks/use-disposables.js';import{useEvent as z}from'../hooks/use-event.js';import{useIsoMorphicEffect as A}from'../hooks/use-iso-morphic-effect.js';let y=_({styles:void 0,setReference:()=>{},setFloating:()=>{},getReferenceProps:()=>({}),getFloatingProps:()=>({}),slot:{}});y.displayName=\"FloatingContext\";let S=_(null);S.displayName=\"PlacementContext\";function xe(e){return v(()=>e?typeof e==\"string\"?{to:e}:e:null,[e])}function ye(){return R(y).setReference}function Fe(){return R(y).getReferenceProps}function be(){let{getFloatingProps:e,slot:t}=R(y);return ae((...n)=>Object.assign({},e(...n),{\"data-anchor\":t.anchor}),[e,t])}function Re(e=null){e===!1&&(e=null),typeof e==\"string\"&&(e={to:e});let t=R(S),n=v(()=>e,[JSON.stringify(e,typeof HTMLElement!=\"undefined\"?(a,r)=>r instanceof HTMLElement?r.outerHTML:r:void 0)]);A(()=>{t==null||t(n!=null?n:null)},[t,n]);let l=R(y);return v(()=>[l.setFloating,e?l.styles:{}],[l.setFloating,e,l.styles])}let q=4;function ve({children:e,enabled:t=!0}){let[n,l]=E(null),[a,r]=E(0),c=ue(null),[u,i]=E(null);pe(u);let o=t&&n!==null&&u!==null,{to:F=\"bottom\",gap:C=0,offset:M=0,padding:p=0,inner:P}=ce(n,u),[s,f=\"center\"]=F.split(\" \");A(()=>{o&&r(0)},[o]);let{refs:b,floatingStyles:$,context:g}=oe({open:o,placement:s===\"selection\"?f===\"center\"?\"bottom\":`bottom-${f}`:f===\"center\"?`${s}`:`${s}-${f}`,strategy:\"absolute\",transform:!1,middleware:[ne({mainAxis:s===\"selection\"?0:C,crossAxis:M}),le({padding:p}),s!==\"selection\"&&ee({padding:p}),s===\"selection\"&&P?te({...P,padding:p,overflowRef:c,offset:a,minItemsVisible:q,referenceOverflowThreshold:p,onFallbackChange(h){var W,k;if(!h)return;let d=g.elements.floating;if(!d)return;let T=parseFloat(getComputedStyle(d).scrollPaddingBottom)||0,w=Math.min(q,d.childElementCount),B=0,O=0;for(let m of(k=(W=g.elements.floating)==null?void 0:W.childNodes)!=null?k:[])if(m instanceof HTMLElement){let x=m.offsetTop,N=x+m.clientHeight+T,H=d.scrollTop,U=H+d.clientHeight;if(x>=H&&N<=U)w--;else{O=Math.max(0,Math.min(N,U)-Math.max(x,H)),B=m.clientHeight;break}}w>=1&&r(m=>{let x=B*w-O+T;return m>=x?m:x})}}):null,re({padding:p,apply({availableWidth:h,availableHeight:d,elements:T}){Object.assign(T.floating.style,{overflow:\"auto\",maxWidth:`${h}px`,maxHeight:`min(var(--anchor-max-height, 100vh), ${d}px)`})}})].filter(Boolean),whileElementsMounted:Z}),[I=s,V=f]=g.placement.split(\"-\");s===\"selection\"&&(I=\"selection\");let G=v(()=>({anchor:[I,V].filter(Boolean).join(\" \")}),[I,V]),K=ie(g,{overflowRef:c,onChange:r}),{getReferenceProps:Q,getFloatingProps:X}=se([K]),Y=z(h=>{i(h),b.setFloating(h)});return j.createElement(S.Provider,{value:l},j.createElement(y.Provider,{value:{setFloating:Y,setReference:b.setReference,styles:$,getReferenceProps:Q,getFloatingProps:X,slot:G}},e))}function pe(e){A(()=>{if(!e)return;let t=new MutationObserver(()=>{let n=e.style.maxHeight;parseFloat(n)!==parseInt(n)&&(e.style.maxHeight=`${Math.ceil(parseFloat(n))}px`)});return t.observe(e,{attributes:!0,attributeFilter:[\"style\"]}),()=>{t.disconnect()}},[e])}function ce(e,t){var r,c,u;let n=L((r=e==null?void 0:e.gap)!=null?r:\"var(--anchor-gap, 0)\",t),l=L((c=e==null?void 0:e.offset)!=null?c:\"var(--anchor-offset, 0)\",t),a=L((u=e==null?void 0:e.padding)!=null?u:\"var(--anchor-padding, 0)\",t);return{...e,gap:n,offset:l,padding:a}}function L(e,t,n=void 0){let l=fe(),a=z((i,o)=>{if(i==null)return[n,null];if(typeof i==\"number\")return[i,null];if(typeof i==\"string\"){if(!o)return[n,null];let F=J(i,o);return[F,C=>{let M=D(i);{let p=M.map(P=>window.getComputedStyle(o).getPropertyValue(P));l.requestAnimationFrame(function P(){l.nextFrame(P);let s=!1;for(let[b,$]of M.entries()){let g=window.getComputedStyle(o).getPropertyValue($);if(p[b]!==g){p[b]=g,s=!0;break}}if(!s)return;let f=J(i,o);F!==f&&(C(f),F=f)})}return l.dispose}]}return[n,null]}),r=v(()=>a(e,t)[0],[e,t]),[c=r,u]=E();return A(()=>{let[i,o]=a(e,t);if(u(i),!!o)return o(u)},[e,t]),c}function D(e){let t=/var\\((.*)\\)/.exec(e);if(t){let n=t[1].indexOf(\",\");if(n===-1)return[t[1]];let l=t[1].slice(0,n).trim(),a=t[1].slice(n+1).trim();return a?[l,...D(a)]:[l]}return[]}function J(e,t){let n=document.createElement(\"div\");t.appendChild(n),n.style.setProperty(\"margin-top\",\"0px\",\"important\"),n.style.setProperty(\"margin-top\",e,\"important\");let l=parseFloat(window.getComputedStyle(n).marginTop)||0;return t.removeChild(n),l}export{ve as FloatingProvider,Re as useFloatingPanel,be as useFloatingPanelProps,ye as useFloatingReference,Fe as useFloatingReferenceProps,xe as useResolvedAnchor};\n","import n,{createContext as d,useContext as i}from\"react\";let e=d(void 0);function u(){return i(e)}function f({id:t,children:r}){return n.createElement(e.Provider,{value:t},r)}export{f as IdProvider,u as useProvidedId};\n","function r(n){let e=n.parentElement,l=null;for(;e&&!(e instanceof HTMLFieldSetElement);)e instanceof HTMLLegendElement&&(l=e),e=e.parentElement;let t=(e==null?void 0:e.getAttribute(\"disabled\"))===\"\";return t&&i(l)?!1:t}function i(n){if(!n)return!1;let e=n.previousElementSibling;for(;e!==null;){if(e instanceof HTMLLegendElement)return!1;e=e.previousElementSibling}return!0}export{r as isDisabledReactIssue7711};\n","function u(l){throw new Error(\"Unexpected object: \"+l)}var c=(i=>(i[i.First=0]=\"First\",i[i.Previous=1]=\"Previous\",i[i.Next=2]=\"Next\",i[i.Last=3]=\"Last\",i[i.Specific=4]=\"Specific\",i[i.Nothing=5]=\"Nothing\",i))(c||{});function f(l,n){let t=n.resolveItems();if(t.length<=0)return null;let r=n.resolveActiveIndex(),s=r!=null?r:-1;switch(l.focus){case 0:{for(let e=0;e<t.length;++e)if(!n.resolveDisabled(t[e],e,t))return e;return r}case 1:{s===-1&&(s=t.length);for(let e=s-1;e>=0;--e)if(!n.resolveDisabled(t[e],e,t))return e;return r}case 2:{for(let e=s+1;e<t.length;++e)if(!n.resolveDisabled(t[e],e,t))return e;return r}case 3:{for(let e=t.length-1;e>=0;--e)if(!n.resolveDisabled(t[e],e,t))return e;return r}case 4:{for(let e=0;e<t.length;++e)if(n.resolveId(t[e],e,t)===l.id)return e;return r}case 5:return null;default:u(l)}}export{c as Focus,f as calculateActiveIndex};\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ function $c87311424ea30a05$var$testUserAgent(re) {\n    var _window_navigator_userAgentData;\n    if (typeof window === 'undefined' || window.navigator == null) return false;\n    return ((_window_navigator_userAgentData = window.navigator['userAgentData']) === null || _window_navigator_userAgentData === void 0 ? void 0 : _window_navigator_userAgentData.brands.some((brand)=>re.test(brand.brand))) || re.test(window.navigator.userAgent);\n}\nfunction $c87311424ea30a05$var$testPlatform(re) {\n    var _window_navigator_userAgentData;\n    return typeof window !== 'undefined' && window.navigator != null ? re.test(((_window_navigator_userAgentData = window.navigator['userAgentData']) === null || _window_navigator_userAgentData === void 0 ? void 0 : _window_navigator_userAgentData.platform) || window.navigator.platform) : false;\n}\nfunction $c87311424ea30a05$export$9ac100e40613ea10() {\n    return $c87311424ea30a05$var$testPlatform(/^Mac/i);\n}\nfunction $c87311424ea30a05$export$186c6964ca17d99() {\n    return $c87311424ea30a05$var$testPlatform(/^iPhone/i);\n}\nfunction $c87311424ea30a05$export$7bef049ce92e4224() {\n    return $c87311424ea30a05$var$testPlatform(/^iPad/i) || // iPadOS 13 lies and says it's a Mac, but we can distinguish by detecting touch support.\n    $c87311424ea30a05$export$9ac100e40613ea10() && navigator.maxTouchPoints > 1;\n}\nfunction $c87311424ea30a05$export$fedb369cb70207f1() {\n    return $c87311424ea30a05$export$186c6964ca17d99() || $c87311424ea30a05$export$7bef049ce92e4224();\n}\nfunction $c87311424ea30a05$export$e1865c3bedcd822b() {\n    return $c87311424ea30a05$export$9ac100e40613ea10() || $c87311424ea30a05$export$fedb369cb70207f1();\n}\nfunction $c87311424ea30a05$export$78551043582a6a98() {\n    return $c87311424ea30a05$var$testUserAgent(/AppleWebKit/i) && !$c87311424ea30a05$export$6446a186d09e379e();\n}\nfunction $c87311424ea30a05$export$6446a186d09e379e() {\n    return $c87311424ea30a05$var$testUserAgent(/Chrome/i);\n}\nfunction $c87311424ea30a05$export$a11b0059900ceec8() {\n    return $c87311424ea30a05$var$testUserAgent(/Android/i);\n}\nfunction $c87311424ea30a05$export$b7d78993b74f766d() {\n    return $c87311424ea30a05$var$testUserAgent(/Firefox/i);\n}\n\n\nexport {$c87311424ea30a05$export$9ac100e40613ea10 as isMac, $c87311424ea30a05$export$186c6964ca17d99 as isIPhone, $c87311424ea30a05$export$7bef049ce92e4224 as isIPad, $c87311424ea30a05$export$fedb369cb70207f1 as isIOS, $c87311424ea30a05$export$e1865c3bedcd822b as isAppleDevice, $c87311424ea30a05$export$78551043582a6a98 as isWebKit, $c87311424ea30a05$export$6446a186d09e379e as isChrome, $c87311424ea30a05$export$a11b0059900ceec8 as isAndroid, $c87311424ea30a05$export$b7d78993b74f766d as isFirefox};\n//# sourceMappingURL=platform.module.js.map\n","import {isAndroid as $c87311424ea30a05$export$a11b0059900ceec8} from \"./platform.mjs\";\n\n/*\n * Copyright 2022 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ \nfunction $6a7db85432448f7f$export$60278871457622de(event) {\n    // JAWS/NVDA with Firefox.\n    if (event.mozInputSource === 0 && event.isTrusted) return true;\n    // Android TalkBack's detail value varies depending on the event listener providing the event so we have specific logic here instead\n    // If pointerType is defined, event is from a click listener. For events from mousedown listener, detail === 0 is a sufficient check\n    // to detect TalkBack virtual clicks.\n    if ((0, $c87311424ea30a05$export$a11b0059900ceec8)() && event.pointerType) return event.type === 'click' && event.buttons === 1;\n    return event.detail === 0 && !event.pointerType;\n}\nfunction $6a7db85432448f7f$export$29bf1b5f2c56cf63(event) {\n    // If the pointer size is zero, then we assume it's from a screen reader.\n    // Android TalkBack double tap will sometimes return a event with width and height of 1\n    // and pointerType === 'mouse' so we need to check for a specific combination of event attributes.\n    // Cannot use \"event.pressure === 0\" as the sole check due to Safari pointer events always returning pressure === 0\n    // instead of .5, see https://bugs.webkit.org/show_bug.cgi?id=206216. event.pointerType === 'mouse' is to distingush\n    // Talkback double tap from Windows Firefox touch screen press\n    return !(0, $c87311424ea30a05$export$a11b0059900ceec8)() && event.width === 0 && event.height === 0 || event.width === 1 && event.height === 1 && event.pressure === 0 && event.detail === 0 && event.pointerType === 'mouse';\n}\n\n\nexport {$6a7db85432448f7f$export$60278871457622de as isVirtualClick, $6a7db85432448f7f$export$29bf1b5f2c56cf63 as isVirtualPointerEvent};\n//# sourceMappingURL=isVirtualEvent.module.js.map\n","const $431fbd86ca7dc216$export$b204af158042fbac = (el)=>{\n    var _el_ownerDocument;\n    return (_el_ownerDocument = el === null || el === void 0 ? void 0 : el.ownerDocument) !== null && _el_ownerDocument !== void 0 ? _el_ownerDocument : document;\n};\nconst $431fbd86ca7dc216$export$f21a1ffae260145a = (el)=>{\n    if (el && 'window' in el && el.window === el) return el;\n    const doc = $431fbd86ca7dc216$export$b204af158042fbac(el);\n    return doc.defaultView || window;\n};\n\n\nexport {$431fbd86ca7dc216$export$b204af158042fbac as getOwnerDocument, $431fbd86ca7dc216$export$f21a1ffae260145a as getOwnerWindow};\n//# sourceMappingURL=domHelpers.module.js.map\n","import {isMac as $28AnR$isMac, isVirtualClick as $28AnR$isVirtualClick, getOwnerWindow as $28AnR$getOwnerWindow, getOwnerDocument as $28AnR$getOwnerDocument} from \"@react-aria/utils\";\nimport {useState as $28AnR$useState, useEffect as $28AnR$useEffect} from \"react\";\nimport {useIsSSR as $28AnR$useIsSSR} from \"@react-aria/ssr\";\n\n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ // Portions of the code in this file are based on code from react.\n// Original licensing for the following can be found in the\n// NOTICE file in the root directory of this source tree.\n// See https://github.com/facebook/react/tree/cc7c1aece46a6b69b41958d731e0fd27c94bfc6c/packages/react-interactions\n\n\n\nlet $507fabe10e71c6fb$var$currentModality = null;\nlet $507fabe10e71c6fb$var$changeHandlers = new Set();\nlet $507fabe10e71c6fb$export$d90243b58daecda7 = new Map(); // We use a map here to support setting event listeners across multiple document objects.\nlet $507fabe10e71c6fb$var$hasEventBeforeFocus = false;\nlet $507fabe10e71c6fb$var$hasBlurredWindowRecently = false;\n// Only Tab or Esc keys will make focus visible on text input elements\nconst $507fabe10e71c6fb$var$FOCUS_VISIBLE_INPUT_KEYS = {\n    Tab: true,\n    Escape: true\n};\nfunction $507fabe10e71c6fb$var$triggerChangeHandlers(modality, e) {\n    for (let handler of $507fabe10e71c6fb$var$changeHandlers)handler(modality, e);\n}\n/**\n * Helper function to determine if a KeyboardEvent is unmodified and could make keyboard focus styles visible.\n */ function $507fabe10e71c6fb$var$isValidKey(e) {\n    // Control and Shift keys trigger when navigating back to the tab with keyboard.\n    return !(e.metaKey || !(0, $28AnR$isMac)() && e.altKey || e.ctrlKey || e.key === 'Control' || e.key === 'Shift' || e.key === 'Meta');\n}\nfunction $507fabe10e71c6fb$var$handleKeyboardEvent(e) {\n    $507fabe10e71c6fb$var$hasEventBeforeFocus = true;\n    if ($507fabe10e71c6fb$var$isValidKey(e)) {\n        $507fabe10e71c6fb$var$currentModality = 'keyboard';\n        $507fabe10e71c6fb$var$triggerChangeHandlers('keyboard', e);\n    }\n}\nfunction $507fabe10e71c6fb$var$handlePointerEvent(e) {\n    $507fabe10e71c6fb$var$currentModality = 'pointer';\n    if (e.type === 'mousedown' || e.type === 'pointerdown') {\n        $507fabe10e71c6fb$var$hasEventBeforeFocus = true;\n        $507fabe10e71c6fb$var$triggerChangeHandlers('pointer', e);\n    }\n}\nfunction $507fabe10e71c6fb$var$handleClickEvent(e) {\n    if ((0, $28AnR$isVirtualClick)(e)) {\n        $507fabe10e71c6fb$var$hasEventBeforeFocus = true;\n        $507fabe10e71c6fb$var$currentModality = 'virtual';\n    }\n}\nfunction $507fabe10e71c6fb$var$handleFocusEvent(e) {\n    // Firefox fires two extra focus events when the user first clicks into an iframe:\n    // first on the window, then on the document. We ignore these events so they don't\n    // cause keyboard focus rings to appear.\n    if (e.target === window || e.target === document) return;\n    // If a focus event occurs without a preceding keyboard or pointer event, switch to virtual modality.\n    // This occurs, for example, when navigating a form with the next/previous buttons on iOS.\n    if (!$507fabe10e71c6fb$var$hasEventBeforeFocus && !$507fabe10e71c6fb$var$hasBlurredWindowRecently) {\n        $507fabe10e71c6fb$var$currentModality = 'virtual';\n        $507fabe10e71c6fb$var$triggerChangeHandlers('virtual', e);\n    }\n    $507fabe10e71c6fb$var$hasEventBeforeFocus = false;\n    $507fabe10e71c6fb$var$hasBlurredWindowRecently = false;\n}\nfunction $507fabe10e71c6fb$var$handleWindowBlur() {\n    // When the window is blurred, reset state. This is necessary when tabbing out of the window,\n    // for example, since a subsequent focus event won't be fired.\n    $507fabe10e71c6fb$var$hasEventBeforeFocus = false;\n    $507fabe10e71c6fb$var$hasBlurredWindowRecently = true;\n}\n/**\n * Setup global event listeners to control when keyboard focus style should be visible.\n */ function $507fabe10e71c6fb$var$setupGlobalFocusEvents(element) {\n    if (typeof window === 'undefined' || $507fabe10e71c6fb$export$d90243b58daecda7.get((0, $28AnR$getOwnerWindow)(element))) return;\n    const windowObject = (0, $28AnR$getOwnerWindow)(element);\n    const documentObject = (0, $28AnR$getOwnerDocument)(element);\n    // Programmatic focus() calls shouldn't affect the current input modality.\n    // However, we need to detect other cases when a focus event occurs without\n    // a preceding user event (e.g. screen reader focus). Overriding the focus\n    // method on HTMLElement.prototype is a bit hacky, but works.\n    let focus = windowObject.HTMLElement.prototype.focus;\n    windowObject.HTMLElement.prototype.focus = function() {\n        $507fabe10e71c6fb$var$hasEventBeforeFocus = true;\n        focus.apply(this, arguments);\n    };\n    documentObject.addEventListener('keydown', $507fabe10e71c6fb$var$handleKeyboardEvent, true);\n    documentObject.addEventListener('keyup', $507fabe10e71c6fb$var$handleKeyboardEvent, true);\n    documentObject.addEventListener('click', $507fabe10e71c6fb$var$handleClickEvent, true);\n    // Register focus events on the window so they are sure to happen\n    // before React's event listeners (registered on the document).\n    windowObject.addEventListener('focus', $507fabe10e71c6fb$var$handleFocusEvent, true);\n    windowObject.addEventListener('blur', $507fabe10e71c6fb$var$handleWindowBlur, false);\n    if (typeof PointerEvent !== 'undefined') {\n        documentObject.addEventListener('pointerdown', $507fabe10e71c6fb$var$handlePointerEvent, true);\n        documentObject.addEventListener('pointermove', $507fabe10e71c6fb$var$handlePointerEvent, true);\n        documentObject.addEventListener('pointerup', $507fabe10e71c6fb$var$handlePointerEvent, true);\n    } else {\n        documentObject.addEventListener('mousedown', $507fabe10e71c6fb$var$handlePointerEvent, true);\n        documentObject.addEventListener('mousemove', $507fabe10e71c6fb$var$handlePointerEvent, true);\n        documentObject.addEventListener('mouseup', $507fabe10e71c6fb$var$handlePointerEvent, true);\n    }\n    // Add unmount handler\n    windowObject.addEventListener('beforeunload', ()=>{\n        $507fabe10e71c6fb$var$tearDownWindowFocusTracking(element);\n    }, {\n        once: true\n    });\n    $507fabe10e71c6fb$export$d90243b58daecda7.set(windowObject, {\n        focus: focus\n    });\n}\nconst $507fabe10e71c6fb$var$tearDownWindowFocusTracking = (element, loadListener)=>{\n    const windowObject = (0, $28AnR$getOwnerWindow)(element);\n    const documentObject = (0, $28AnR$getOwnerDocument)(element);\n    if (loadListener) documentObject.removeEventListener('DOMContentLoaded', loadListener);\n    if (!$507fabe10e71c6fb$export$d90243b58daecda7.has(windowObject)) return;\n    windowObject.HTMLElement.prototype.focus = $507fabe10e71c6fb$export$d90243b58daecda7.get(windowObject).focus;\n    documentObject.removeEventListener('keydown', $507fabe10e71c6fb$var$handleKeyboardEvent, true);\n    documentObject.removeEventListener('keyup', $507fabe10e71c6fb$var$handleKeyboardEvent, true);\n    documentObject.removeEventListener('click', $507fabe10e71c6fb$var$handleClickEvent, true);\n    windowObject.removeEventListener('focus', $507fabe10e71c6fb$var$handleFocusEvent, true);\n    windowObject.removeEventListener('blur', $507fabe10e71c6fb$var$handleWindowBlur, false);\n    if (typeof PointerEvent !== 'undefined') {\n        documentObject.removeEventListener('pointerdown', $507fabe10e71c6fb$var$handlePointerEvent, true);\n        documentObject.removeEventListener('pointermove', $507fabe10e71c6fb$var$handlePointerEvent, true);\n        documentObject.removeEventListener('pointerup', $507fabe10e71c6fb$var$handlePointerEvent, true);\n    } else {\n        documentObject.removeEventListener('mousedown', $507fabe10e71c6fb$var$handlePointerEvent, true);\n        documentObject.removeEventListener('mousemove', $507fabe10e71c6fb$var$handlePointerEvent, true);\n        documentObject.removeEventListener('mouseup', $507fabe10e71c6fb$var$handlePointerEvent, true);\n    }\n    $507fabe10e71c6fb$export$d90243b58daecda7.delete(windowObject);\n};\nfunction $507fabe10e71c6fb$export$2f1888112f558a7d(element) {\n    const documentObject = (0, $28AnR$getOwnerDocument)(element);\n    let loadListener;\n    if (documentObject.readyState !== 'loading') $507fabe10e71c6fb$var$setupGlobalFocusEvents(element);\n    else {\n        loadListener = ()=>{\n            $507fabe10e71c6fb$var$setupGlobalFocusEvents(element);\n        };\n        documentObject.addEventListener('DOMContentLoaded', loadListener);\n    }\n    return ()=>$507fabe10e71c6fb$var$tearDownWindowFocusTracking(element, loadListener);\n}\n// Server-side rendering does not have the document object defined\n// eslint-disable-next-line no-restricted-globals\nif (typeof document !== 'undefined') $507fabe10e71c6fb$export$2f1888112f558a7d();\nfunction $507fabe10e71c6fb$export$b9b3dfddab17db27() {\n    return $507fabe10e71c6fb$var$currentModality !== 'pointer';\n}\nfunction $507fabe10e71c6fb$export$630ff653c5ada6a9() {\n    return $507fabe10e71c6fb$var$currentModality;\n}\nfunction $507fabe10e71c6fb$export$8397ddfc504fdb9a(modality) {\n    $507fabe10e71c6fb$var$currentModality = modality;\n    $507fabe10e71c6fb$var$triggerChangeHandlers(modality, null);\n}\nfunction $507fabe10e71c6fb$export$98e20ec92f614cfe() {\n    $507fabe10e71c6fb$var$setupGlobalFocusEvents();\n    let [modality, setModality] = (0, $28AnR$useState)($507fabe10e71c6fb$var$currentModality);\n    (0, $28AnR$useEffect)(()=>{\n        let handler = ()=>{\n            setModality($507fabe10e71c6fb$var$currentModality);\n        };\n        $507fabe10e71c6fb$var$changeHandlers.add(handler);\n        return ()=>{\n            $507fabe10e71c6fb$var$changeHandlers.delete(handler);\n        };\n    }, []);\n    return (0, $28AnR$useIsSSR)() ? null : modality;\n}\nconst $507fabe10e71c6fb$var$nonTextInputTypes = new Set([\n    'checkbox',\n    'radio',\n    'range',\n    'color',\n    'file',\n    'image',\n    'button',\n    'submit',\n    'reset'\n]);\n/**\n * If this is attached to text input component, return if the event is a focus event (Tab/Escape keys pressed) so that\n * focus visible style can be properly set.\n */ function $507fabe10e71c6fb$var$isKeyboardFocusEvent(isTextInput, modality, e) {\n    var _e_target;\n    const IHTMLInputElement = typeof window !== 'undefined' ? (0, $28AnR$getOwnerWindow)(e === null || e === void 0 ? void 0 : e.target).HTMLInputElement : HTMLInputElement;\n    const IHTMLTextAreaElement = typeof window !== 'undefined' ? (0, $28AnR$getOwnerWindow)(e === null || e === void 0 ? void 0 : e.target).HTMLTextAreaElement : HTMLTextAreaElement;\n    const IHTMLElement = typeof window !== 'undefined' ? (0, $28AnR$getOwnerWindow)(e === null || e === void 0 ? void 0 : e.target).HTMLElement : HTMLElement;\n    const IKeyboardEvent = typeof window !== 'undefined' ? (0, $28AnR$getOwnerWindow)(e === null || e === void 0 ? void 0 : e.target).KeyboardEvent : KeyboardEvent;\n    isTextInput = isTextInput || (e === null || e === void 0 ? void 0 : e.target) instanceof IHTMLInputElement && !$507fabe10e71c6fb$var$nonTextInputTypes.has(e === null || e === void 0 ? void 0 : (_e_target = e.target) === null || _e_target === void 0 ? void 0 : _e_target.type) || (e === null || e === void 0 ? void 0 : e.target) instanceof IHTMLTextAreaElement || (e === null || e === void 0 ? void 0 : e.target) instanceof IHTMLElement && (e === null || e === void 0 ? void 0 : e.target.isContentEditable);\n    return !(isTextInput && modality === 'keyboard' && e instanceof IKeyboardEvent && !$507fabe10e71c6fb$var$FOCUS_VISIBLE_INPUT_KEYS[e.key]);\n}\nfunction $507fabe10e71c6fb$export$ffd9e5021c1fb2d6(props = {}) {\n    let { isTextInput: isTextInput, autoFocus: autoFocus } = props;\n    let [isFocusVisibleState, setFocusVisible] = (0, $28AnR$useState)(autoFocus || $507fabe10e71c6fb$export$b9b3dfddab17db27());\n    $507fabe10e71c6fb$export$ec71b4b83ac08ec3((isFocusVisible)=>{\n        setFocusVisible(isFocusVisible);\n    }, [\n        isTextInput\n    ], {\n        isTextInput: isTextInput\n    });\n    return {\n        isFocusVisible: isFocusVisibleState\n    };\n}\nfunction $507fabe10e71c6fb$export$ec71b4b83ac08ec3(fn, deps, opts) {\n    $507fabe10e71c6fb$var$setupGlobalFocusEvents();\n    (0, $28AnR$useEffect)(()=>{\n        let handler = (modality, e)=>{\n            if (!$507fabe10e71c6fb$var$isKeyboardFocusEvent(!!(opts === null || opts === void 0 ? void 0 : opts.isTextInput), modality, e)) return;\n            fn($507fabe10e71c6fb$export$b9b3dfddab17db27());\n        };\n        $507fabe10e71c6fb$var$changeHandlers.add(handler);\n        return ()=>{\n            $507fabe10e71c6fb$var$changeHandlers.delete(handler);\n        };\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    }, deps);\n}\n\n\nexport {$507fabe10e71c6fb$export$d90243b58daecda7 as hasSetupGlobalListeners, $507fabe10e71c6fb$export$2f1888112f558a7d as addWindowFocusTracking, $507fabe10e71c6fb$export$b9b3dfddab17db27 as isFocusVisible, $507fabe10e71c6fb$export$630ff653c5ada6a9 as getInteractionModality, $507fabe10e71c6fb$export$8397ddfc504fdb9a as setInteractionModality, $507fabe10e71c6fb$export$98e20ec92f614cfe as useInteractionModality, $507fabe10e71c6fb$export$ffd9e5021c1fb2d6 as useFocusVisible, $507fabe10e71c6fb$export$ec71b4b83ac08ec3 as useFocusVisibleListener};\n//# sourceMappingURL=useFocusVisible.module.js.map\n","import $HgANd$react from \"react\";\n\n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ \nconst $f0a04ccd8dbdd83b$export$e5c5a5f917a5871c = typeof document !== 'undefined' ? (0, $HgANd$react).useLayoutEffect : ()=>{};\n\n\nexport {$f0a04ccd8dbdd83b$export$e5c5a5f917a5871c as useLayoutEffect};\n//# sourceMappingURL=useLayoutEffect.module.js.map\n","import {useLayoutEffect as $f0a04ccd8dbdd83b$export$e5c5a5f917a5871c} from \"./useLayoutEffect.mjs\";\nimport {useRef as $lmaYr$useRef, useCallback as $lmaYr$useCallback} from \"react\";\n\n/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ \n\nfunction $8ae05eaa5c114e9c$export$7f54fc3180508a52(fn) {\n    const ref = (0, $lmaYr$useRef)(null);\n    (0, $f0a04ccd8dbdd83b$export$e5c5a5f917a5871c)(()=>{\n        ref.current = fn;\n    }, [\n        fn\n    ]);\n    // @ts-ignore\n    return (0, $lmaYr$useCallback)((...args)=>{\n        const f = ref.current;\n        return f === null || f === void 0 ? void 0 : f(...args);\n    }, []);\n}\n\n\nexport {$8ae05eaa5c114e9c$export$7f54fc3180508a52 as useEffectEvent};\n//# sourceMappingURL=useEffectEvent.module.js.map\n","import {useRef as $6dfIe$useRef, useCallback as $6dfIe$useCallback} from \"react\";\nimport {useLayoutEffect as $6dfIe$useLayoutEffect, useEffectEvent as $6dfIe$useEffectEvent} from \"@react-aria/utils\";\n\n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ \n\nclass $8a9cb279dc87e130$export$905e7fc544a71f36 {\n    isDefaultPrevented() {\n        return this.nativeEvent.defaultPrevented;\n    }\n    preventDefault() {\n        this.defaultPrevented = true;\n        this.nativeEvent.preventDefault();\n    }\n    stopPropagation() {\n        this.nativeEvent.stopPropagation();\n        this.isPropagationStopped = ()=>true;\n    }\n    isPropagationStopped() {\n        return false;\n    }\n    persist() {}\n    constructor(type, nativeEvent){\n        this.nativeEvent = nativeEvent;\n        this.target = nativeEvent.target;\n        this.currentTarget = nativeEvent.currentTarget;\n        this.relatedTarget = nativeEvent.relatedTarget;\n        this.bubbles = nativeEvent.bubbles;\n        this.cancelable = nativeEvent.cancelable;\n        this.defaultPrevented = nativeEvent.defaultPrevented;\n        this.eventPhase = nativeEvent.eventPhase;\n        this.isTrusted = nativeEvent.isTrusted;\n        this.timeStamp = nativeEvent.timeStamp;\n        this.type = type;\n    }\n}\nfunction $8a9cb279dc87e130$export$715c682d09d639cc(onBlur) {\n    let stateRef = (0, $6dfIe$useRef)({\n        isFocused: false,\n        observer: null\n    });\n    // Clean up MutationObserver on unmount. See below.\n    // eslint-disable-next-line arrow-body-style\n    (0, $6dfIe$useLayoutEffect)(()=>{\n        const state = stateRef.current;\n        return ()=>{\n            if (state.observer) {\n                state.observer.disconnect();\n                state.observer = null;\n            }\n        };\n    }, []);\n    let dispatchBlur = (0, $6dfIe$useEffectEvent)((e)=>{\n        onBlur === null || onBlur === void 0 ? void 0 : onBlur(e);\n    });\n    // This function is called during a React onFocus event.\n    return (0, $6dfIe$useCallback)((e)=>{\n        // React does not fire onBlur when an element is disabled. https://github.com/facebook/react/issues/9142\n        // Most browsers fire a native focusout event in this case, except for Firefox. In that case, we use a\n        // MutationObserver to watch for the disabled attribute, and dispatch these events ourselves.\n        // For browsers that do, focusout fires before the MutationObserver, so onBlur should not fire twice.\n        if (e.target instanceof HTMLButtonElement || e.target instanceof HTMLInputElement || e.target instanceof HTMLTextAreaElement || e.target instanceof HTMLSelectElement) {\n            stateRef.current.isFocused = true;\n            let target = e.target;\n            let onBlurHandler = (e)=>{\n                stateRef.current.isFocused = false;\n                if (target.disabled) // For backward compatibility, dispatch a (fake) React synthetic event.\n                dispatchBlur(new $8a9cb279dc87e130$export$905e7fc544a71f36('blur', e));\n                // We no longer need the MutationObserver once the target is blurred.\n                if (stateRef.current.observer) {\n                    stateRef.current.observer.disconnect();\n                    stateRef.current.observer = null;\n                }\n            };\n            target.addEventListener('focusout', onBlurHandler, {\n                once: true\n            });\n            stateRef.current.observer = new MutationObserver(()=>{\n                if (stateRef.current.isFocused && target.disabled) {\n                    var _stateRef_current_observer;\n                    (_stateRef_current_observer = stateRef.current.observer) === null || _stateRef_current_observer === void 0 ? void 0 : _stateRef_current_observer.disconnect();\n                    let relatedTargetEl = target === document.activeElement ? null : document.activeElement;\n                    target.dispatchEvent(new FocusEvent('blur', {\n                        relatedTarget: relatedTargetEl\n                    }));\n                    target.dispatchEvent(new FocusEvent('focusout', {\n                        bubbles: true,\n                        relatedTarget: relatedTargetEl\n                    }));\n                }\n            });\n            stateRef.current.observer.observe(target, {\n                attributes: true,\n                attributeFilter: [\n                    'disabled'\n                ]\n            });\n        }\n    }, [\n        dispatchBlur\n    ]);\n}\n\n\nexport {$8a9cb279dc87e130$export$905e7fc544a71f36 as SyntheticFocusEvent, $8a9cb279dc87e130$export$715c682d09d639cc as useSyntheticBlurEvent};\n//# sourceMappingURL=utils.module.js.map\n","import {useSyntheticBlurEvent as $8a9cb279dc87e130$export$715c682d09d639cc} from \"./utils.mjs\";\nimport {useCallback as $hf0lj$useCallback} from \"react\";\nimport {getOwnerDocument as $hf0lj$getOwnerDocument} from \"@react-aria/utils\";\n\n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ // Portions of the code in this file are based on code from react.\n// Original licensing for the following can be found in the\n// NOTICE file in the root directory of this source tree.\n// See https://github.com/facebook/react/tree/cc7c1aece46a6b69b41958d731e0fd27c94bfc6c/packages/react-interactions\n\n\n\nfunction $a1ea59d68270f0dd$export$f8168d8dd8fd66e6(props) {\n    let { isDisabled: isDisabled, onFocus: onFocusProp, onBlur: onBlurProp, onFocusChange: onFocusChange } = props;\n    const onBlur = (0, $hf0lj$useCallback)((e)=>{\n        if (e.target === e.currentTarget) {\n            if (onBlurProp) onBlurProp(e);\n            if (onFocusChange) onFocusChange(false);\n            return true;\n        }\n    }, [\n        onBlurProp,\n        onFocusChange\n    ]);\n    const onSyntheticFocus = (0, $8a9cb279dc87e130$export$715c682d09d639cc)(onBlur);\n    const onFocus = (0, $hf0lj$useCallback)((e)=>{\n        // Double check that document.activeElement actually matches e.target in case a previously chained\n        // focus handler already moved focus somewhere else.\n        const ownerDocument = (0, $hf0lj$getOwnerDocument)(e.target);\n        if (e.target === e.currentTarget && ownerDocument.activeElement === e.target) {\n            if (onFocusProp) onFocusProp(e);\n            if (onFocusChange) onFocusChange(true);\n            onSyntheticFocus(e);\n        }\n    }, [\n        onFocusChange,\n        onFocusProp,\n        onSyntheticFocus\n    ]);\n    return {\n        focusProps: {\n            onFocus: !isDisabled && (onFocusProp || onFocusChange || onBlurProp) ? onFocus : undefined,\n            onBlur: !isDisabled && (onBlurProp || onFocusChange) ? onBlur : undefined\n        }\n    };\n}\n\n\nexport {$a1ea59d68270f0dd$export$f8168d8dd8fd66e6 as useFocus};\n//# sourceMappingURL=useFocus.module.js.map\n","import {useSyntheticBlurEvent as $8a9cb279dc87e130$export$715c682d09d639cc} from \"./utils.mjs\";\nimport {useRef as $3b9Q0$useRef, useCallback as $3b9Q0$useCallback} from \"react\";\n\n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ // Portions of the code in this file are based on code from react.\n// Original licensing for the following can be found in the\n// NOTICE file in the root directory of this source tree.\n// See https://github.com/facebook/react/tree/cc7c1aece46a6b69b41958d731e0fd27c94bfc6c/packages/react-interactions\n\n\nfunction $9ab94262bd0047c7$export$420e68273165f4ec(props) {\n    let { isDisabled: isDisabled, onBlurWithin: onBlurWithin, onFocusWithin: onFocusWithin, onFocusWithinChange: onFocusWithinChange } = props;\n    let state = (0, $3b9Q0$useRef)({\n        isFocusWithin: false\n    });\n    let onBlur = (0, $3b9Q0$useCallback)((e)=>{\n        // We don't want to trigger onBlurWithin and then immediately onFocusWithin again\n        // when moving focus inside the element. Only trigger if the currentTarget doesn't\n        // include the relatedTarget (where focus is moving).\n        if (state.current.isFocusWithin && !e.currentTarget.contains(e.relatedTarget)) {\n            state.current.isFocusWithin = false;\n            if (onBlurWithin) onBlurWithin(e);\n            if (onFocusWithinChange) onFocusWithinChange(false);\n        }\n    }, [\n        onBlurWithin,\n        onFocusWithinChange,\n        state\n    ]);\n    let onSyntheticFocus = (0, $8a9cb279dc87e130$export$715c682d09d639cc)(onBlur);\n    let onFocus = (0, $3b9Q0$useCallback)((e)=>{\n        // Double check that document.activeElement actually matches e.target in case a previously chained\n        // focus handler already moved focus somewhere else.\n        if (!state.current.isFocusWithin && document.activeElement === e.target) {\n            if (onFocusWithin) onFocusWithin(e);\n            if (onFocusWithinChange) onFocusWithinChange(true);\n            state.current.isFocusWithin = true;\n            onSyntheticFocus(e);\n        }\n    }, [\n        onFocusWithin,\n        onFocusWithinChange,\n        onSyntheticFocus\n    ]);\n    if (isDisabled) return {\n        focusWithinProps: {\n            // These should not have been null, that would conflict in mergeProps\n            onFocus: undefined,\n            onBlur: undefined\n        }\n    };\n    return {\n        focusWithinProps: {\n            onFocus: onFocus,\n            onBlur: onBlur\n        }\n    };\n}\n\n\nexport {$9ab94262bd0047c7$export$420e68273165f4ec as useFocusWithin};\n//# sourceMappingURL=useFocusWithin.module.js.map\n","import {isFocusVisible as $isWE5$isFocusVisible, useFocusVisibleListener as $isWE5$useFocusVisibleListener, useFocus as $isWE5$useFocus, useFocusWithin as $isWE5$useFocusWithin} from \"@react-aria/interactions\";\nimport {useRef as $isWE5$useRef, useState as $isWE5$useState, useCallback as $isWE5$useCallback} from \"react\";\n\n\n\nfunction $f7dceffc5ad7768b$export$4e328f61c538687f(props = {}) {\n    let { autoFocus: autoFocus = false, isTextInput: isTextInput, within: within } = props;\n    let state = (0, $isWE5$useRef)({\n        isFocused: false,\n        isFocusVisible: autoFocus || (0, $isWE5$isFocusVisible)()\n    });\n    let [isFocused, setFocused] = (0, $isWE5$useState)(false);\n    let [isFocusVisibleState, setFocusVisible] = (0, $isWE5$useState)(()=>state.current.isFocused && state.current.isFocusVisible);\n    let updateState = (0, $isWE5$useCallback)(()=>setFocusVisible(state.current.isFocused && state.current.isFocusVisible), []);\n    let onFocusChange = (0, $isWE5$useCallback)((isFocused)=>{\n        state.current.isFocused = isFocused;\n        setFocused(isFocused);\n        updateState();\n    }, [\n        updateState\n    ]);\n    (0, $isWE5$useFocusVisibleListener)((isFocusVisible)=>{\n        state.current.isFocusVisible = isFocusVisible;\n        updateState();\n    }, [], {\n        isTextInput: isTextInput\n    });\n    let { focusProps: focusProps } = (0, $isWE5$useFocus)({\n        isDisabled: within,\n        onFocusChange: onFocusChange\n    });\n    let { focusWithinProps: focusWithinProps } = (0, $isWE5$useFocusWithin)({\n        isDisabled: !within,\n        onFocusWithinChange: onFocusChange\n    });\n    return {\n        isFocused: isFocused,\n        isFocusVisible: isFocusVisibleState,\n        focusProps: within ? focusWithinProps : focusProps\n    };\n}\n\n\nexport {$f7dceffc5ad7768b$export$4e328f61c538687f as useFocusRing};\n//# sourceMappingURL=useFocusRing.module.js.map\n","import {useState as $AWxnT$useState, useRef as $AWxnT$useRef, useEffect as $AWxnT$useEffect, useMemo as $AWxnT$useMemo} from \"react\";\n\n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ // Portions of the code in this file are based on code from react.\n// Original licensing for the following can be found in the\n// NOTICE file in the root directory of this source tree.\n// See https://github.com/facebook/react/tree/cc7c1aece46a6b69b41958d731e0fd27c94bfc6c/packages/react-interactions\n\n// iOS fires onPointerEnter twice: once with pointerType=\"touch\" and again with pointerType=\"mouse\".\n// We want to ignore these emulated events so they do not trigger hover behavior.\n// See https://bugs.webkit.org/show_bug.cgi?id=214609.\nlet $6179b936705e76d3$var$globalIgnoreEmulatedMouseEvents = false;\nlet $6179b936705e76d3$var$hoverCount = 0;\nfunction $6179b936705e76d3$var$setGlobalIgnoreEmulatedMouseEvents() {\n    $6179b936705e76d3$var$globalIgnoreEmulatedMouseEvents = true;\n    // Clear globalIgnoreEmulatedMouseEvents after a short timeout. iOS fires onPointerEnter\n    // with pointerType=\"mouse\" immediately after onPointerUp and before onFocus. On other\n    // devices that don't have this quirk, we don't want to ignore a mouse hover sometime in\n    // the distant future because a user previously touched the element.\n    setTimeout(()=>{\n        $6179b936705e76d3$var$globalIgnoreEmulatedMouseEvents = false;\n    }, 50);\n}\nfunction $6179b936705e76d3$var$handleGlobalPointerEvent(e) {\n    if (e.pointerType === 'touch') $6179b936705e76d3$var$setGlobalIgnoreEmulatedMouseEvents();\n}\nfunction $6179b936705e76d3$var$setupGlobalTouchEvents() {\n    if (typeof document === 'undefined') return;\n    if (typeof PointerEvent !== 'undefined') document.addEventListener('pointerup', $6179b936705e76d3$var$handleGlobalPointerEvent);\n    else document.addEventListener('touchend', $6179b936705e76d3$var$setGlobalIgnoreEmulatedMouseEvents);\n    $6179b936705e76d3$var$hoverCount++;\n    return ()=>{\n        $6179b936705e76d3$var$hoverCount--;\n        if ($6179b936705e76d3$var$hoverCount > 0) return;\n        if (typeof PointerEvent !== 'undefined') document.removeEventListener('pointerup', $6179b936705e76d3$var$handleGlobalPointerEvent);\n        else document.removeEventListener('touchend', $6179b936705e76d3$var$setGlobalIgnoreEmulatedMouseEvents);\n    };\n}\nfunction $6179b936705e76d3$export$ae780daf29e6d456(props) {\n    let { onHoverStart: onHoverStart, onHoverChange: onHoverChange, onHoverEnd: onHoverEnd, isDisabled: isDisabled } = props;\n    let [isHovered, setHovered] = (0, $AWxnT$useState)(false);\n    let state = (0, $AWxnT$useRef)({\n        isHovered: false,\n        ignoreEmulatedMouseEvents: false,\n        pointerType: '',\n        target: null\n    }).current;\n    (0, $AWxnT$useEffect)($6179b936705e76d3$var$setupGlobalTouchEvents, []);\n    let { hoverProps: hoverProps, triggerHoverEnd: triggerHoverEnd } = (0, $AWxnT$useMemo)(()=>{\n        let triggerHoverStart = (event, pointerType)=>{\n            state.pointerType = pointerType;\n            if (isDisabled || pointerType === 'touch' || state.isHovered || !event.currentTarget.contains(event.target)) return;\n            state.isHovered = true;\n            let target = event.currentTarget;\n            state.target = target;\n            if (onHoverStart) onHoverStart({\n                type: 'hoverstart',\n                target: target,\n                pointerType: pointerType\n            });\n            if (onHoverChange) onHoverChange(true);\n            setHovered(true);\n        };\n        let triggerHoverEnd = (event, pointerType)=>{\n            state.pointerType = '';\n            state.target = null;\n            if (pointerType === 'touch' || !state.isHovered) return;\n            state.isHovered = false;\n            let target = event.currentTarget;\n            if (onHoverEnd) onHoverEnd({\n                type: 'hoverend',\n                target: target,\n                pointerType: pointerType\n            });\n            if (onHoverChange) onHoverChange(false);\n            setHovered(false);\n        };\n        let hoverProps = {};\n        if (typeof PointerEvent !== 'undefined') {\n            hoverProps.onPointerEnter = (e)=>{\n                if ($6179b936705e76d3$var$globalIgnoreEmulatedMouseEvents && e.pointerType === 'mouse') return;\n                triggerHoverStart(e, e.pointerType);\n            };\n            hoverProps.onPointerLeave = (e)=>{\n                if (!isDisabled && e.currentTarget.contains(e.target)) triggerHoverEnd(e, e.pointerType);\n            };\n        } else {\n            hoverProps.onTouchStart = ()=>{\n                state.ignoreEmulatedMouseEvents = true;\n            };\n            hoverProps.onMouseEnter = (e)=>{\n                if (!state.ignoreEmulatedMouseEvents && !$6179b936705e76d3$var$globalIgnoreEmulatedMouseEvents) triggerHoverStart(e, 'mouse');\n                state.ignoreEmulatedMouseEvents = false;\n            };\n            hoverProps.onMouseLeave = (e)=>{\n                if (!isDisabled && e.currentTarget.contains(e.target)) triggerHoverEnd(e, 'mouse');\n            };\n        }\n        return {\n            hoverProps: hoverProps,\n            triggerHoverEnd: triggerHoverEnd\n        };\n    }, [\n        onHoverStart,\n        onHoverChange,\n        onHoverEnd,\n        isDisabled,\n        state\n    ]);\n    (0, $AWxnT$useEffect)(()=>{\n        // Call the triggerHoverEnd as soon as isDisabled changes to true\n        // Safe to call triggerHoverEnd, it will early return if we aren't currently hovering\n        if (isDisabled) triggerHoverEnd({\n            currentTarget: state.target\n        }, state.pointerType);\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    }, [\n        isDisabled\n    ]);\n    return {\n        hoverProps: hoverProps,\n        isHovered: isHovered\n    };\n}\n\n\nexport {$6179b936705e76d3$export$ae780daf29e6d456 as useHover};\n//# sourceMappingURL=useHover.module.js.map\n","import { getObjectType } from \"./getObjectType.js\";\nexport function checkRendering(rendering, usage) {\n  if (rendering === undefined || typeof rendering !== 'function') {\n    throw new Error(\"The render function is not valid (received type \".concat(getObjectType(rendering), \").\\n\\n\").concat(usage));\n  }\n}","export function getObjectType(object) {\n  return Object.prototype.toString.call(object).slice(8, -1);\n}","export function createDocumentationLink(_ref) {\n  var name = _ref.name,\n    _ref$connector = _ref.connector,\n    connector = _ref$connector === void 0 ? false : _ref$connector;\n  return ['https://www.algolia.com/doc/api-reference/widgets/', name, '/js/', connector ? '#connector' : ''].join('');\n}\nexport function createDocumentationMessageGenerator() {\n  for (var _len = arguments.length, widgets = new Array(_len), _key = 0; _key < _len; _key++) {\n    widgets[_key] = arguments[_key];\n  }\n  var links = widgets.map(function (widget) {\n    return createDocumentationLink(widget);\n  }).join(', ');\n  return function (message) {\n    return [message, \"See documentation: \".concat(links)].filter(Boolean).join('\\n\\n');\n  };\n}","function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nfunction _objectDestructuringEmpty(obj) { if (obj == null) throw new TypeError(\"Cannot destructure \" + obj); }\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\nimport { escape } from \"./escape-html.js\";\nimport { isPlainObject } from \"./isPlainObject.js\";\nexport var TAG_PLACEHOLDER = {\n  highlightPreTag: '__ais-highlight__',\n  highlightPostTag: '__/ais-highlight__'\n};\nexport var TAG_REPLACEMENT = {\n  highlightPreTag: '<mark>',\n  highlightPostTag: '</mark>'\n};\n\n// @MAJOR: in the future, this should only escape, not replace\nfunction replaceTagsAndEscape(value) {\n  return escape(value).replace(new RegExp(TAG_PLACEHOLDER.highlightPreTag, 'g'), TAG_REPLACEMENT.highlightPreTag).replace(new RegExp(TAG_PLACEHOLDER.highlightPostTag, 'g'), TAG_REPLACEMENT.highlightPostTag);\n}\nfunction recursiveEscape(input) {\n  if (isPlainObject(input) && typeof input.value !== 'string') {\n    return Object.keys(input).reduce(function (acc, key) {\n      return _objectSpread(_objectSpread({}, acc), {}, _defineProperty({}, key, recursiveEscape(input[key])));\n    }, {});\n  }\n  if (Array.isArray(input)) {\n    return input.map(recursiveEscape);\n  }\n  return _objectSpread(_objectSpread({}, input), {}, {\n    value: replaceTagsAndEscape(input.value)\n  });\n}\nexport function escapeHits(hits) {\n  if (hits.__escaped === undefined) {\n    // We don't override the value on hit because it will mutate the raw results\n    // instead we make a shallow copy and we assign the escaped values on it.\n    hits = hits.map(function (_ref) {\n      var hit = _extends({}, (_objectDestructuringEmpty(_ref), _ref));\n      if (hit._highlightResult) {\n        hit._highlightResult = recursiveEscape(hit._highlightResult);\n      }\n      if (hit._snippetResult) {\n        hit._snippetResult = recursiveEscape(hit._snippetResult);\n      }\n      return hit;\n    });\n    hits.__escaped = true;\n  }\n  return hits;\n}\nexport function escapeFacets(facetHits) {\n  return facetHits.map(function (h) {\n    return _objectSpread(_objectSpread({}, h), {}, {\n      highlighted: replaceTagsAndEscape(h.highlighted)\n    });\n  });\n}","/**\n * This implementation is taken from Lodash implementation.\n * See: https://github.com/lodash/lodash/blob/4.17.11-npm/escape.js\n */\n\n// Used to map characters to HTML entities.\nvar htmlEntities = {\n  '&': '&amp;',\n  '<': '&lt;',\n  '>': '&gt;',\n  '\"': '&quot;',\n  \"'\": '&#39;'\n};\n\n// Used to match HTML entities and HTML characters.\nvar regexUnescapedHtml = /[&<>\"']/g;\nvar regexHasUnescapedHtml = RegExp(regexUnescapedHtml.source);\n\n/**\n * Converts the characters \"&\", \"<\", \">\", '\"', and \"'\" in `string` to their\n * corresponding HTML entities.\n */\nexport function escape(value) {\n  return value && regexHasUnescapedHtml.test(value) ? value.replace(regexUnescapedHtml, function (character) {\n    return htmlEntities[character];\n  }) : value;\n}\n\n/**\n * This implementation is taken from Lodash implementation.\n * See: https://github.com/lodash/lodash/blob/4.17.11-npm/unescape.js\n */\n\n// Used to map HTML entities to characters.\nvar htmlCharacters = {\n  '&amp;': '&',\n  '&lt;': '<',\n  '&gt;': '>',\n  '&quot;': '\"',\n  '&#39;': \"'\"\n};\n\n// Used to match HTML entities and HTML characters.\nvar regexEscapedHtml = /&(amp|quot|lt|gt|#39);/g;\nvar regexHasEscapedHtml = RegExp(regexEscapedHtml.source);\n\n/**\n * Converts the HTML entities \"&\", \"<\", \">\", '\"', and \"'\" in `string` to their\n * characters.\n */\nexport function unescape(value) {\n  return value && regexHasEscapedHtml.test(value) ? value.replace(regexEscapedHtml, function (character) {\n    return htmlCharacters[character];\n  }) : value;\n}","export function isIndexWidget(widget) {\n  return widget.$$type === 'ais.index';\n}","function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n/**\n * This implementation is taken from Lodash implementation.\n * See: https://github.com/lodash/lodash/blob/master/isPlainObject.js\n */\n\nfunction getTag(value) {\n  if (value === null) {\n    return value === undefined ? '[object Undefined]' : '[object Null]';\n  }\n  return Object.prototype.toString.call(value);\n}\nfunction isObjectLike(value) {\n  return _typeof(value) === 'object' && value !== null;\n}\n\n/**\n * Checks if `value` is a plain object.\n *\n * A plain object is an object created by the `Object`\n * constructor or with a `[[Prototype]]` of `null`.\n */\nexport function isPlainObject(value) {\n  if (!isObjectLike(value) || getTag(value) !== '[object Object]') {\n    return false;\n  }\n  if (Object.getPrototypeOf(value) === null) {\n    return true;\n  }\n  var proto = value;\n  while (Object.getPrototypeOf(proto) !== null) {\n    proto = Object.getPrototypeOf(proto);\n  }\n  return Object.getPrototypeOf(value) === proto;\n}","function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nvar _excluded = [\"facets\", \"disjunctiveFacets\", \"facetsRefinements\", \"facetsExcludes\", \"disjunctiveFacetsRefinements\", \"numericRefinements\", \"tagRefinements\", \"hierarchicalFacets\", \"hierarchicalFacetsRefinements\", \"ruleContexts\"];\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\nimport { findIndex } from \"./findIndex.js\";\nimport { uniq } from \"./uniq.js\";\nvar mergeWithRest = function mergeWithRest(left, right) {\n  var facets = right.facets,\n    disjunctiveFacets = right.disjunctiveFacets,\n    facetsRefinements = right.facetsRefinements,\n    facetsExcludes = right.facetsExcludes,\n    disjunctiveFacetsRefinements = right.disjunctiveFacetsRefinements,\n    numericRefinements = right.numericRefinements,\n    tagRefinements = right.tagRefinements,\n    hierarchicalFacets = right.hierarchicalFacets,\n    hierarchicalFacetsRefinements = right.hierarchicalFacetsRefinements,\n    ruleContexts = right.ruleContexts,\n    rest = _objectWithoutProperties(right, _excluded);\n  return left.setQueryParameters(rest);\n};\n\n// Merge facets\nvar mergeFacets = function mergeFacets(left, right) {\n  return right.facets.reduce(function (_, name) {\n    return _.addFacet(name);\n  }, left);\n};\nvar mergeDisjunctiveFacets = function mergeDisjunctiveFacets(left, right) {\n  return right.disjunctiveFacets.reduce(function (_, name) {\n    return _.addDisjunctiveFacet(name);\n  }, left);\n};\nvar mergeHierarchicalFacets = function mergeHierarchicalFacets(left, right) {\n  return left.setQueryParameters({\n    hierarchicalFacets: right.hierarchicalFacets.reduce(function (facets, facet) {\n      var index = findIndex(facets, function (_) {\n        return _.name === facet.name;\n      });\n      if (index === -1) {\n        return facets.concat(facet);\n      }\n      var nextFacets = facets.slice();\n      nextFacets.splice(index, 1, facet);\n      return nextFacets;\n    }, left.hierarchicalFacets)\n  });\n};\n\n// Merge facet refinements\nvar mergeTagRefinements = function mergeTagRefinements(left, right) {\n  return right.tagRefinements.reduce(function (_, value) {\n    return _.addTagRefinement(value);\n  }, left);\n};\nvar mergeFacetRefinements = function mergeFacetRefinements(left, right) {\n  return left.setQueryParameters({\n    facetsRefinements: _objectSpread(_objectSpread({}, left.facetsRefinements), right.facetsRefinements)\n  });\n};\nvar mergeFacetsExcludes = function mergeFacetsExcludes(left, right) {\n  return left.setQueryParameters({\n    facetsExcludes: _objectSpread(_objectSpread({}, left.facetsExcludes), right.facetsExcludes)\n  });\n};\nvar mergeDisjunctiveFacetsRefinements = function mergeDisjunctiveFacetsRefinements(left, right) {\n  return left.setQueryParameters({\n    disjunctiveFacetsRefinements: _objectSpread(_objectSpread({}, left.disjunctiveFacetsRefinements), right.disjunctiveFacetsRefinements)\n  });\n};\nvar mergeNumericRefinements = function mergeNumericRefinements(left, right) {\n  return left.setQueryParameters({\n    numericRefinements: _objectSpread(_objectSpread({}, left.numericRefinements), right.numericRefinements)\n  });\n};\nvar mergeHierarchicalFacetsRefinements = function mergeHierarchicalFacetsRefinements(left, right) {\n  return left.setQueryParameters({\n    hierarchicalFacetsRefinements: _objectSpread(_objectSpread({}, left.hierarchicalFacetsRefinements), right.hierarchicalFacetsRefinements)\n  });\n};\nvar mergeRuleContexts = function mergeRuleContexts(left, right) {\n  var ruleContexts = uniq([].concat(left.ruleContexts).concat(right.ruleContexts).filter(Boolean));\n  if (ruleContexts.length > 0) {\n    return left.setQueryParameters({\n      ruleContexts: ruleContexts\n    });\n  }\n  return left;\n};\nexport var mergeSearchParameters = function mergeSearchParameters() {\n  for (var _len = arguments.length, parameters = new Array(_len), _key = 0; _key < _len; _key++) {\n    parameters[_key] = arguments[_key];\n  }\n  return parameters.reduce(function (left, right) {\n    var hierarchicalFacetsRefinementsMerged = mergeHierarchicalFacetsRefinements(left, right);\n    var hierarchicalFacetsMerged = mergeHierarchicalFacets(hierarchicalFacetsRefinementsMerged, right);\n    var tagRefinementsMerged = mergeTagRefinements(hierarchicalFacetsMerged, right);\n    var numericRefinementsMerged = mergeNumericRefinements(tagRefinementsMerged, right);\n    var disjunctiveFacetsRefinementsMerged = mergeDisjunctiveFacetsRefinements(numericRefinementsMerged, right);\n    var facetsExcludesMerged = mergeFacetsExcludes(disjunctiveFacetsRefinementsMerged, right);\n    var facetRefinementsMerged = mergeFacetRefinements(facetsExcludesMerged, right);\n    var disjunctiveFacetsMerged = mergeDisjunctiveFacets(facetRefinementsMerged, right);\n    var ruleContextsMerged = mergeRuleContexts(disjunctiveFacetsMerged, right);\n    var facetsMerged = mergeFacets(ruleContextsMerged, right);\n    return mergeWithRest(facetsMerged, right);\n  });\n};","// We aren't using the native `Array.prototype.findIndex` because the refactor away from Lodash is not\n// published as a major version.\n// Relying on the `findIndex` polyfill on user-land, which before was only required for niche use-cases,\n// was decided as too risky.\n// @MAJOR Replace with the native `Array.prototype.findIndex` method\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/findIndex\nexport function findIndex(array, comparator) {\n  if (!Array.isArray(array)) {\n    return -1;\n  }\n  for (var i = 0; i < array.length; i++) {\n    if (comparator(array[i])) {\n      return i;\n    }\n  }\n  return -1;\n}","export function uniq(array) {\n  return array.filter(function (value, index, self) {\n    return self.indexOf(value) === index;\n  });\n}","export function noop() {}","export function createInitArgs(instantSearchInstance, parent, uiState) {\n  var helper = parent.getHelper();\n  return {\n    uiState: uiState,\n    helper: helper,\n    parent: parent,\n    instantSearchInstance: instantSearchInstance,\n    state: helper.state,\n    renderState: instantSearchInstance.renderState,\n    templatesConfig: instantSearchInstance.templatesConfig,\n    createURL: parent.createURL,\n    scopedResults: [],\n    searchMetadata: {\n      isSearchStalled: instantSearchInstance.status === 'stalled'\n    },\n    status: instantSearchInstance.status,\n    error: instantSearchInstance.error\n  };\n}\nexport function createRenderArgs(instantSearchInstance, parent) {\n  var results = parent.getResults();\n  var helper = parent.getHelper();\n  return {\n    helper: helper,\n    parent: parent,\n    instantSearchInstance: instantSearchInstance,\n    results: results,\n    scopedResults: parent.getScopedResults(),\n    state: results ? results._state : helper.state,\n    renderState: instantSearchInstance.renderState,\n    templatesConfig: instantSearchInstance.templatesConfig,\n    createURL: parent.createURL,\n    searchMetadata: {\n      isSearchStalled: instantSearchInstance.status === 'stalled'\n    },\n    status: instantSearchInstance.status,\n    error: instantSearchInstance.error\n  };\n}","export function serializePayload(payload) {\n  return btoa(encodeURIComponent(JSON.stringify(payload)));\n}\nexport function deserializePayload(serialized) {\n  return JSON.parse(decodeURIComponent(atob(serialized)));\n}","function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nvar _excluded = [\"initialSearchParameters\"];\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\nfunction _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }\nfunction _nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\nfunction _iterableToArray(iter) { if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter); }\nfunction _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\nimport algoliasearchHelper from 'algoliasearch-helper';\nimport { checkIndexUiState, createDocumentationMessageGenerator, resolveSearchParameters, mergeSearchParameters, warning, isIndexWidget, createInitArgs, createRenderArgs } from \"../../lib/utils/index.js\";\nvar withUsage = createDocumentationMessageGenerator({\n  name: 'index-widget'\n});\n/**\n * This is the same content as helper._change / setState, but allowing for extra\n * UiState to be synchronized.\n * see: https://github.com/algolia/algoliasearch-helper-js/blob/6b835ffd07742f2d6b314022cce6848f5cfecd4a/src/algoliasearch.helper.js#L1311-L1324\n */\nfunction privateHelperSetState(helper, _ref) {\n  var state = _ref.state,\n    isPageReset = _ref.isPageReset,\n    _uiState = _ref._uiState;\n  if (state !== helper.state) {\n    helper.state = state;\n    helper.emit('change', {\n      state: helper.state,\n      results: helper.lastResults,\n      isPageReset: isPageReset,\n      _uiState: _uiState\n    });\n  }\n}\nfunction getLocalWidgetsUiState(widgets, widgetStateOptions) {\n  var initialUiState = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n  return widgets.reduce(function (uiState, widget) {\n    if (isIndexWidget(widget)) {\n      return uiState;\n    }\n    if (!widget.getWidgetUiState && !widget.getWidgetState) {\n      return uiState;\n    }\n    if (widget.getWidgetUiState) {\n      return widget.getWidgetUiState(uiState, widgetStateOptions);\n    }\n    return widget.getWidgetState(uiState, widgetStateOptions);\n  }, initialUiState);\n}\nfunction getLocalWidgetsSearchParameters(widgets, widgetSearchParametersOptions) {\n  var initialSearchParameters = widgetSearchParametersOptions.initialSearchParameters,\n    rest = _objectWithoutProperties(widgetSearchParametersOptions, _excluded);\n  return widgets.filter(function (widget) {\n    return !isIndexWidget(widget);\n  }).reduce(function (state, widget) {\n    if (!widget.getWidgetSearchParameters) {\n      return state;\n    }\n    return widget.getWidgetSearchParameters(state, rest);\n  }, initialSearchParameters);\n}\nfunction resetPageFromWidgets(widgets) {\n  var indexWidgets = widgets.filter(isIndexWidget);\n  if (indexWidgets.length === 0) {\n    return;\n  }\n  indexWidgets.forEach(function (widget) {\n    var widgetHelper = widget.getHelper();\n    privateHelperSetState(widgetHelper, {\n      state: widgetHelper.state.resetPage(),\n      isPageReset: true\n    });\n    resetPageFromWidgets(widget.getWidgets());\n  });\n}\nfunction resolveScopedResultsFromWidgets(widgets) {\n  var indexWidgets = widgets.filter(isIndexWidget);\n  return indexWidgets.reduce(function (scopedResults, current) {\n    return scopedResults.concat.apply(scopedResults, [{\n      indexId: current.getIndexId(),\n      results: current.getResults(),\n      helper: current.getHelper()\n    }].concat(_toConsumableArray(resolveScopedResultsFromWidgets(current.getWidgets()))));\n  }, []);\n}\nvar index = function index(widgetParams) {\n  if (widgetParams === undefined || widgetParams.indexName === undefined) {\n    throw new Error(withUsage('The `indexName` option is required.'));\n  }\n  var indexName = widgetParams.indexName,\n    _widgetParams$indexId = widgetParams.indexId,\n    indexId = _widgetParams$indexId === void 0 ? indexName : _widgetParams$indexId;\n  var localWidgets = [];\n  var localUiState = {};\n  var localInstantSearchInstance = null;\n  var localParent = null;\n  var helper = null;\n  var derivedHelper = null;\n  var lastValidSearchParameters = null;\n  return {\n    $$type: 'ais.index',\n    $$widgetType: 'ais.index',\n    getIndexName: function getIndexName() {\n      return indexName;\n    },\n    getIndexId: function getIndexId() {\n      return indexId;\n    },\n    getHelper: function getHelper() {\n      return helper;\n    },\n    getResults: function getResults() {\n      var _derivedHelper;\n      if (!((_derivedHelper = derivedHelper) !== null && _derivedHelper !== void 0 && _derivedHelper.lastResults)) return null;\n\n      // To make the UI optimistic, we patch the state to display to the current\n      // one instead of the one associated with the latest results.\n      // This means user-driven UI changes (e.g., checked checkbox) are reflected\n      // immediately instead of waiting for Algolia to respond, regardless of\n      // the status of the network request.\n      derivedHelper.lastResults._state = helper.state;\n      return derivedHelper.lastResults;\n    },\n    getPreviousState: function getPreviousState() {\n      return lastValidSearchParameters;\n    },\n    getScopedResults: function getScopedResults() {\n      var widgetParent = this.getParent();\n\n      // If the widget is the root, we consider itself as the only sibling.\n      var widgetSiblings = widgetParent ? widgetParent.getWidgets() : [this];\n      return resolveScopedResultsFromWidgets(widgetSiblings);\n    },\n    getParent: function getParent() {\n      return localParent;\n    },\n    createURL: function createURL(nextState) {\n      if (typeof nextState === 'function') {\n        return localInstantSearchInstance._createURL(_defineProperty({}, indexId, nextState(localUiState)));\n      }\n      return localInstantSearchInstance._createURL(_defineProperty({}, indexId, getLocalWidgetsUiState(localWidgets, {\n        searchParameters: nextState,\n        helper: helper\n      })));\n    },\n    getWidgets: function getWidgets() {\n      return localWidgets;\n    },\n    addWidgets: function addWidgets(widgets) {\n      var _this = this;\n      if (!Array.isArray(widgets)) {\n        throw new Error(withUsage('The `addWidgets` method expects an array of widgets.'));\n      }\n      if (widgets.some(function (widget) {\n        return typeof widget.init !== 'function' && typeof widget.render !== 'function';\n      })) {\n        throw new Error(withUsage('The widget definition expects a `render` and/or an `init` method.'));\n      }\n      localWidgets = localWidgets.concat(widgets);\n      if (localInstantSearchInstance && Boolean(widgets.length)) {\n        privateHelperSetState(helper, {\n          state: getLocalWidgetsSearchParameters(localWidgets, {\n            uiState: localUiState,\n            initialSearchParameters: helper.state\n          }),\n          _uiState: localUiState\n        });\n\n        // We compute the render state before calling `init` in a separate loop\n        // to construct the whole render state object that is then passed to\n        // `init`.\n        widgets.forEach(function (widget) {\n          if (widget.getRenderState) {\n            var renderState = widget.getRenderState(localInstantSearchInstance.renderState[_this.getIndexId()] || {}, createInitArgs(localInstantSearchInstance, _this, localInstantSearchInstance._initialUiState));\n            storeRenderState({\n              renderState: renderState,\n              instantSearchInstance: localInstantSearchInstance,\n              parent: _this\n            });\n          }\n        });\n        widgets.forEach(function (widget) {\n          if (widget.init) {\n            widget.init(createInitArgs(localInstantSearchInstance, _this, localInstantSearchInstance._initialUiState));\n          }\n        });\n        localInstantSearchInstance.scheduleSearch();\n      }\n      return this;\n    },\n    removeWidgets: function removeWidgets(widgets) {\n      var _this2 = this;\n      if (!Array.isArray(widgets)) {\n        throw new Error(withUsage('The `removeWidgets` method expects an array of widgets.'));\n      }\n      if (widgets.some(function (widget) {\n        return typeof widget.dispose !== 'function';\n      })) {\n        throw new Error(withUsage('The widget definition expects a `dispose` method.'));\n      }\n      localWidgets = localWidgets.filter(function (widget) {\n        return widgets.indexOf(widget) === -1;\n      });\n      if (localInstantSearchInstance && Boolean(widgets.length)) {\n        var _nextState = widgets.reduce(function (state, widget) {\n          // the `dispose` method exists at this point we already assert it\n          var next = widget.dispose({\n            helper: helper,\n            state: state,\n            parent: _this2\n          });\n          return next || state;\n        }, helper.state);\n        localUiState = getLocalWidgetsUiState(localWidgets, {\n          searchParameters: _nextState,\n          helper: helper\n        });\n        helper.setState(getLocalWidgetsSearchParameters(localWidgets, {\n          uiState: localUiState,\n          initialSearchParameters: _nextState\n        }));\n        if (localWidgets.length) {\n          localInstantSearchInstance.scheduleSearch();\n        }\n      }\n      return this;\n    },\n    init: function init(_ref2) {\n      var _this3 = this,\n        _instantSearchInstanc;\n      var instantSearchInstance = _ref2.instantSearchInstance,\n        parent = _ref2.parent,\n        uiState = _ref2.uiState;\n      if (helper !== null) {\n        // helper is already initialized, therefore we do not need to set up\n        // any listeners\n        return;\n      }\n      localInstantSearchInstance = instantSearchInstance;\n      localParent = parent;\n      localUiState = uiState[indexId] || {};\n\n      // The `mainHelper` is already defined at this point. The instance is created\n      // inside InstantSearch at the `start` method, which occurs before the `init`\n      // step.\n      var mainHelper = instantSearchInstance.mainHelper;\n      var parameters = getLocalWidgetsSearchParameters(localWidgets, {\n        uiState: localUiState,\n        initialSearchParameters: new algoliasearchHelper.SearchParameters({\n          index: indexName\n        })\n      });\n\n      // This Helper is only used for state management we do not care about the\n      // `searchClient`. Only the \"main\" Helper created at the `InstantSearch`\n      // level is aware of the client.\n      helper = algoliasearchHelper({}, parameters.index, parameters);\n\n      // We forward the call to `search` to the \"main\" instance of the Helper\n      // which is responsible for managing the queries (it's the only one that is\n      // aware of the `searchClient`).\n      helper.search = function () {\n        if (instantSearchInstance.onStateChange) {\n          instantSearchInstance.onStateChange({\n            uiState: instantSearchInstance.mainIndex.getWidgetUiState({}),\n            setUiState: function setUiState(nextState) {\n              return instantSearchInstance.setUiState(nextState, false);\n            }\n          });\n\n          // We don't trigger a search when controlled because it becomes the\n          // responsibility of `setUiState`.\n          return mainHelper;\n        }\n        return mainHelper.search();\n      };\n      helper.searchWithoutTriggeringOnStateChange = function () {\n        return mainHelper.search();\n      };\n\n      // We use the same pattern for the `searchForFacetValues`.\n      helper.searchForFacetValues = function (facetName, facetValue, maxFacetHits, userState) {\n        var state = helper.state.setQueryParameters(userState);\n        return mainHelper.searchForFacetValues(facetName, facetValue, maxFacetHits, state);\n      };\n      derivedHelper = mainHelper.derive(function () {\n        return mergeSearchParameters.apply(void 0, _toConsumableArray(resolveSearchParameters(_this3)));\n      });\n      var indexInitialResults = (_instantSearchInstanc = instantSearchInstance._initialResults) === null || _instantSearchInstanc === void 0 ? void 0 : _instantSearchInstanc[this.getIndexId()];\n      if (indexInitialResults) {\n        // We restore the shape of the results provided to the instance to respect\n        // the helper's structure.\n        var results = new algoliasearchHelper.SearchResults(new algoliasearchHelper.SearchParameters(indexInitialResults.state), indexInitialResults.results);\n        derivedHelper.lastResults = results;\n        helper.lastResults = results;\n      }\n\n      // Subscribe to the Helper state changes for the page before widgets\n      // are initialized. This behavior mimics the original one of the Helper.\n      // It makes sense to replicate it at the `init` step. We have another\n      // listener on `change` below, once `init` is done.\n      helper.on('change', function (_ref3) {\n        var isPageReset = _ref3.isPageReset;\n        if (isPageReset) {\n          resetPageFromWidgets(localWidgets);\n        }\n      });\n      derivedHelper.on('search', function () {\n        // The index does not manage the \"staleness\" of the search. This is the\n        // responsibility of the main instance. It does not make sense to manage\n        // it at the index level because it's either: all of them or none of them\n        // that are stalled. The queries are performed into a single network request.\n        instantSearchInstance.scheduleStalledRender();\n        if (process.env.NODE_ENV === 'development') {\n          checkIndexUiState({\n            index: _this3,\n            indexUiState: localUiState\n          });\n        }\n      });\n      derivedHelper.on('result', function (_ref4) {\n        var results = _ref4.results;\n        // The index does not render the results it schedules a new render\n        // to let all the other indices emit their own results. It allows us to\n        // run the render process in one pass.\n        instantSearchInstance.scheduleRender();\n\n        // the derived helper is the one which actually searches, but the helper\n        // which is exposed e.g. via instance.helper, doesn't search, and thus\n        // does not have access to lastResults, which it used to in pre-federated\n        // search behavior.\n        helper.lastResults = results;\n        lastValidSearchParameters = results === null || results === void 0 ? void 0 : results._state;\n      });\n\n      // We compute the render state before calling `init` in a separate loop\n      // to construct the whole render state object that is then passed to\n      // `init`.\n      localWidgets.forEach(function (widget) {\n        if (widget.getRenderState) {\n          var renderState = widget.getRenderState(instantSearchInstance.renderState[_this3.getIndexId()] || {}, createInitArgs(instantSearchInstance, _this3, uiState));\n          storeRenderState({\n            renderState: renderState,\n            instantSearchInstance: instantSearchInstance,\n            parent: _this3\n          });\n        }\n      });\n      localWidgets.forEach(function (widget) {\n        process.env.NODE_ENV === 'development' ? warning(\n        // if it has NO getWidgetState or if it has getWidgetUiState, we don't warn\n        // aka we warn if there's _only_ getWidgetState\n        !widget.getWidgetState || Boolean(widget.getWidgetUiState), 'The `getWidgetState` method is renamed `getWidgetUiState` and will no longer exist under that name in InstantSearch.js 5.x. Please use `getWidgetUiState` instead.') : void 0;\n        if (widget.init) {\n          widget.init(createInitArgs(instantSearchInstance, _this3, uiState));\n        }\n      });\n\n      // Subscribe to the Helper state changes for the `uiState` once widgets\n      // are initialized. Until the first render, state changes are part of the\n      // configuration step. This is mainly for backward compatibility with custom\n      // widgets. When the subscription happens before the `init` step, the (static)\n      // configuration of the widget is pushed in the URL. That's what we want to avoid.\n      // https://github.com/algolia/instantsearch/pull/994/commits/4a672ae3fd78809e213de0368549ef12e9dc9454\n      helper.on('change', function (event) {\n        var state = event.state;\n        var _uiState = event._uiState;\n        localUiState = getLocalWidgetsUiState(localWidgets, {\n          searchParameters: state,\n          helper: helper\n        }, _uiState || {});\n\n        // We don't trigger an internal change when controlled because it\n        // becomes the responsibility of `setUiState`.\n        if (!instantSearchInstance.onStateChange) {\n          instantSearchInstance.onInternalStateChange();\n        }\n      });\n      if (indexInitialResults) {\n        // If there are initial results, we're not notified of the next results\n        // because we don't trigger an initial search. We therefore need to directly\n        // schedule a render that will render the results injected on the helper.\n        instantSearchInstance.scheduleRender();\n      }\n    },\n    render: function render(_ref5) {\n      var _this4 = this;\n      var instantSearchInstance = _ref5.instantSearchInstance;\n      // we can't attach a listener to the error event of search, as the error\n      // then would no longer be thrown for global handlers.\n      if (instantSearchInstance.status === 'error' && !instantSearchInstance.mainHelper.hasPendingRequests() && lastValidSearchParameters) {\n        helper.setState(lastValidSearchParameters);\n      }\n\n      // We only render index widgets if there are no results.\n      // This makes sure `render` is never called with `results` being `null`.\n      var widgetsToRender = this.getResults() ? localWidgets : localWidgets.filter(isIndexWidget);\n      widgetsToRender.forEach(function (widget) {\n        if (widget.getRenderState) {\n          var renderState = widget.getRenderState(instantSearchInstance.renderState[_this4.getIndexId()] || {}, createRenderArgs(instantSearchInstance, _this4));\n          storeRenderState({\n            renderState: renderState,\n            instantSearchInstance: instantSearchInstance,\n            parent: _this4\n          });\n        }\n      });\n      widgetsToRender.forEach(function (widget) {\n        // At this point, all the variables used below are set. Both `helper`\n        // and `derivedHelper` have been created at the `init` step. The attribute\n        // `lastResults` might be `null` though. It's possible that a stalled render\n        // happens before the result e.g with a dynamically added index the request might\n        // be delayed. The render is triggered for the complete tree but some parts do\n        // not have results yet.\n\n        if (widget.render) {\n          widget.render(createRenderArgs(instantSearchInstance, _this4));\n        }\n      });\n    },\n    dispose: function dispose() {\n      var _this5 = this,\n        _helper,\n        _derivedHelper2;\n      localWidgets.forEach(function (widget) {\n        if (widget.dispose) {\n          // The dispose function is always called once the instance is started\n          // (it's an effect of `removeWidgets`). The index is initialized and\n          // the Helper is available. We don't care about the return value of\n          // `dispose` because the index is removed. We can't call `removeWidgets`\n          // because we want to keep the widgets on the instance, to allow idempotent\n          // operations on `add` & `remove`.\n          widget.dispose({\n            helper: helper,\n            state: helper.state,\n            parent: _this5\n          });\n        }\n      });\n      localInstantSearchInstance = null;\n      localParent = null;\n      (_helper = helper) === null || _helper === void 0 ? void 0 : _helper.removeAllListeners();\n      helper = null;\n      (_derivedHelper2 = derivedHelper) === null || _derivedHelper2 === void 0 ? void 0 : _derivedHelper2.detach();\n      derivedHelper = null;\n    },\n    getWidgetUiState: function getWidgetUiState(uiState) {\n      return localWidgets.filter(isIndexWidget).reduce(function (previousUiState, innerIndex) {\n        return innerIndex.getWidgetUiState(previousUiState);\n      }, _objectSpread(_objectSpread({}, uiState), {}, _defineProperty({}, indexId, _objectSpread(_objectSpread({}, uiState[indexId]), localUiState))));\n    },\n    getWidgetState: function getWidgetState(uiState) {\n      process.env.NODE_ENV === 'development' ? warning(false, 'The `getWidgetState` method is renamed `getWidgetUiState` and will no longer exist under that name in InstantSearch.js 5.x. Please use `getWidgetUiState` instead.') : void 0;\n      return this.getWidgetUiState(uiState);\n    },\n    getWidgetSearchParameters: function getWidgetSearchParameters(searchParameters, _ref6) {\n      var uiState = _ref6.uiState;\n      return getLocalWidgetsSearchParameters(localWidgets, {\n        uiState: uiState,\n        initialSearchParameters: searchParameters\n      });\n    },\n    refreshUiState: function refreshUiState() {\n      localUiState = getLocalWidgetsUiState(localWidgets, {\n        searchParameters: this.getHelper().state,\n        helper: this.getHelper()\n      }, localUiState);\n    },\n    setIndexUiState: function setIndexUiState(indexUiState) {\n      var nextIndexUiState = typeof indexUiState === 'function' ? indexUiState(localUiState) : indexUiState;\n      localInstantSearchInstance.setUiState(function (state) {\n        return _objectSpread(_objectSpread({}, state), {}, _defineProperty({}, indexId, nextIndexUiState));\n      });\n    }\n  };\n};\nexport default index;\nfunction storeRenderState(_ref7) {\n  var renderState = _ref7.renderState,\n    instantSearchInstance = _ref7.instantSearchInstance,\n    parent = _ref7.parent;\n  var parentIndexName = parent ? parent.getIndexId() : instantSearchInstance.mainIndex.getIndexId();\n  instantSearchInstance.renderState = _objectSpread(_objectSpread({}, instantSearchInstance.renderState), {}, _defineProperty({}, parentIndexName, _objectSpread(_objectSpread({}, instantSearchInstance.renderState[parentIndexName]), renderState)));\n}","export function resolveSearchParameters(current) {\n  var parent = current.getParent();\n  var states = [current.getHelper().state];\n  while (parent !== null) {\n    states = [parent.getHelper().state].concat(states);\n    parent = parent.getParent();\n  }\n  return states;\n}","function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\nimport algoliasearchHelper from 'algoliasearch-helper';\nimport { createDocumentationMessageGenerator, isPlainObject, mergeSearchParameters, noop } from \"../../lib/utils/index.js\";\n\n/**\n * Refine the given search parameters.\n */\n\nvar withUsage = createDocumentationMessageGenerator({\n  name: 'configure',\n  connector: true\n});\nfunction getInitialSearchParameters(state, widgetParams) {\n  // We leverage the helper internals to remove the `widgetParams` from\n  // the state. The function `setQueryParameters` omits the values that\n  // are `undefined` on the next state.\n  return state.setQueryParameters(Object.keys(widgetParams.searchParameters).reduce(function (acc, key) {\n    return _objectSpread(_objectSpread({}, acc), {}, _defineProperty({}, key, undefined));\n  }, {}));\n}\nvar connectConfigure = function connectConfigure() {\n  var renderFn = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : noop;\n  var unmountFn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : noop;\n  return function (widgetParams) {\n    if (!widgetParams || !isPlainObject(widgetParams.searchParameters)) {\n      throw new Error(withUsage('The `searchParameters` option expects an object.'));\n    }\n    var connectorState = {};\n    function refine(helper) {\n      return function (searchParameters) {\n        // Merge new `searchParameters` with the ones set from other widgets\n        var actualState = getInitialSearchParameters(helper.state, widgetParams);\n        var nextSearchParameters = mergeSearchParameters(actualState, new algoliasearchHelper.SearchParameters(searchParameters));\n\n        // Update original `widgetParams.searchParameters` to the new refined one\n        widgetParams.searchParameters = searchParameters;\n\n        // Trigger a search with the resolved search parameters\n        helper.setState(nextSearchParameters).search();\n      };\n    }\n    return {\n      $$type: 'ais.configure',\n      init: function init(initOptions) {\n        var instantSearchInstance = initOptions.instantSearchInstance;\n        renderFn(_objectSpread(_objectSpread({}, this.getWidgetRenderState(initOptions)), {}, {\n          instantSearchInstance: instantSearchInstance\n        }), true);\n      },\n      render: function render(renderOptions) {\n        var instantSearchInstance = renderOptions.instantSearchInstance;\n        renderFn(_objectSpread(_objectSpread({}, this.getWidgetRenderState(renderOptions)), {}, {\n          instantSearchInstance: instantSearchInstance\n        }), false);\n      },\n      dispose: function dispose(_ref) {\n        var state = _ref.state;\n        unmountFn();\n        return getInitialSearchParameters(state, widgetParams);\n      },\n      getRenderState: function getRenderState(renderState, renderOptions) {\n        var _renderState$configur;\n        var widgetRenderState = this.getWidgetRenderState(renderOptions);\n        return _objectSpread(_objectSpread({}, renderState), {}, {\n          configure: _objectSpread(_objectSpread({}, widgetRenderState), {}, {\n            widgetParams: _objectSpread(_objectSpread({}, widgetRenderState.widgetParams), {}, {\n              searchParameters: mergeSearchParameters(new algoliasearchHelper.SearchParameters((_renderState$configur = renderState.configure) === null || _renderState$configur === void 0 ? void 0 : _renderState$configur.widgetParams.searchParameters), new algoliasearchHelper.SearchParameters(widgetRenderState.widgetParams.searchParameters)).getQueryParams()\n            })\n          })\n        });\n      },\n      getWidgetRenderState: function getWidgetRenderState(_ref2) {\n        var helper = _ref2.helper;\n        if (!connectorState.refine) {\n          connectorState.refine = refine(helper);\n        }\n        return {\n          refine: connectorState.refine,\n          widgetParams: widgetParams\n        };\n      },\n      getWidgetSearchParameters: function getWidgetSearchParameters(state, _ref3) {\n        var uiState = _ref3.uiState;\n        return mergeSearchParameters(state, new algoliasearchHelper.SearchParameters(_objectSpread(_objectSpread({}, uiState.configure), widgetParams.searchParameters)));\n      },\n      getWidgetUiState: function getWidgetUiState(uiState) {\n        return _objectSpread(_objectSpread({}, uiState), {}, {\n          configure: _objectSpread(_objectSpread({}, uiState.configure), widgetParams.searchParameters)\n        });\n      }\n    };\n  };\n};\nexport default connectConfigure;","import { useConfigure } from \"../connectors/useConfigure.js\";\nexport function Configure(props) {\n  useConfigure(props, {\n    $$widgetType: 'ais.configure'\n  });\n  return null;\n}","import connectConfigure from \"instantsearch.js/es/connectors/configure/connectConfigure.js\";\nimport { useConnector } from \"../hooks/useConnector.js\";\nexport function useConfigure(props, additionalWidgetProperties) {\n  return useConnector(connectConfigure, {\n    searchParameters: props\n  }, additionalWidgetProperties);\n}","function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nimport { warning } from \"../lib/utils/index.js\";\nexport var ANONYMOUS_TOKEN_COOKIE_KEY = '_ALGOLIA';\nfunction getCookie(name) {\n  if ((typeof document === \"undefined\" ? \"undefined\" : _typeof(document)) !== 'object' || typeof document.cookie !== 'string') {\n    return undefined;\n  }\n  var prefix = \"\".concat(name, \"=\");\n  var cookies = document.cookie.split(';');\n  for (var i = 0; i < cookies.length; i++) {\n    var cookie = cookies[i];\n    while (cookie.charAt(0) === ' ') {\n      cookie = cookie.substring(1);\n    }\n    if (cookie.indexOf(prefix) === 0) {\n      return cookie.substring(prefix.length, cookie.length);\n    }\n  }\n  return undefined;\n}\nexport function getInsightsAnonymousUserTokenInternal() {\n  return getCookie(ANONYMOUS_TOKEN_COOKIE_KEY);\n}\n\n/**\n * @deprecated This function will be still supported in 4.x releases, but not further. It is replaced by the `insights` middleware. For more information, visit https://www.algolia.com/doc/guides/getting-insights-and-analytics/search-analytics/click-through-and-conversions/how-to/send-click-and-conversion-events-with-instantsearch/js/\n */\nexport default function getInsightsAnonymousUserToken() {\n  process.env.NODE_ENV === 'development' ? warning(false, \"`getInsightsAnonymousUserToken` function has been deprecated. It is still supported in 4.x releases, but not further. It is replaced by the `insights` middleware.\\n\\nFor more information, visit https://www.algolia.com/doc/guides/getting-insights-and-analytics/search-analytics/click-through-and-conversions/how-to/send-click-and-conversion-events-with-instantsearch/js/\") : void 0;\n  return getInsightsAnonymousUserTokenInternal();\n}","// eslint-disable-next-line no-restricted-globals\n\n/**\n * Runs code on browser environments safely.\n */\nexport function safelyRunOnBrowser(callback) {\n  var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n      fallback: function fallback() {\n        return undefined;\n      }\n    },\n    fallback = _ref.fallback;\n  // eslint-disable-next-line no-restricted-globals\n  if (typeof window === 'undefined') {\n    return fallback();\n  }\n\n  // eslint-disable-next-line no-restricted-globals\n  return callback({\n    window: window\n  });\n}","function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _iterableToArrayLimit(arr, i) { var _i = null == arr ? null : \"undefined\" != typeof Symbol && arr[Symbol.iterator] || arr[\"@@iterator\"]; if (null != _i) { var _s, _e, _x, _r, _arr = [], _n = !0, _d = !1; try { if (_x = (_i = _i.call(arr)).next, 0 === i) { if (Object(_i) !== _i) return; _n = !1; } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0); } catch (err) { _d = !0, _e = err; } finally { try { if (!_n && null != _i.return && (_r = _i.return(), Object(_r) !== _r)) return; } finally { if (_d) throw _e; } } return _arr; } }\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\nfunction _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }\nfunction _nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\nfunction _iterableToArray(iter) { if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter); }\nfunction _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }\nimport { getInsightsAnonymousUserTokenInternal } from \"../helpers/index.js\";\nimport { warning, noop, getAppIdAndApiKey, find, safelyRunOnBrowser } from \"../lib/utils/index.js\";\nvar ALGOLIA_INSIGHTS_VERSION = '2.6.0';\nvar ALGOLIA_INSIGHTS_SRC = \"https://cdn.jsdelivr.net/npm/search-insights@\".concat(ALGOLIA_INSIGHTS_VERSION, \"/dist/search-insights.min.js\");\nexport function createInsightsMiddleware() {\n  var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n  var _insightsClient = props.insightsClient,\n    insightsInitParams = props.insightsInitParams,\n    onEvent = props.onEvent,\n    _props$$$internal = props.$$internal,\n    $$internal = _props$$$internal === void 0 ? false : _props$$$internal;\n  var potentialInsightsClient = _insightsClient;\n  if (!_insightsClient && _insightsClient !== null) {\n    safelyRunOnBrowser(function (_ref) {\n      var window = _ref.window;\n      var pointer = window.AlgoliaAnalyticsObject || 'aa';\n      if (typeof pointer === 'string') {\n        potentialInsightsClient = window[pointer];\n      }\n      if (!potentialInsightsClient) {\n        window.AlgoliaAnalyticsObject = pointer;\n        if (!window[pointer]) {\n          window[pointer] = function () {\n            if (!window[pointer].queue) {\n              window[pointer].queue = [];\n            }\n            for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n              args[_key] = arguments[_key];\n            }\n            window[pointer].queue.push(args);\n          };\n          window[pointer].version = ALGOLIA_INSIGHTS_VERSION;\n          window[pointer].shouldAddScript = true;\n        }\n        potentialInsightsClient = window[pointer];\n      }\n    });\n  }\n  // if still no insightsClient was found, we use a noop\n  var insightsClient = potentialInsightsClient || noop;\n  return function (_ref2) {\n    var instantSearchInstance = _ref2.instantSearchInstance;\n    // remove existing default insights middleware\n    // user-provided insights middleware takes precedence\n    var existingInsightsMiddlewares = instantSearchInstance.middleware.filter(function (m) {\n      return m.instance.$$type === 'ais.insights' && m.instance.$$internal;\n    }).map(function (m) {\n      return m.creator;\n    });\n    instantSearchInstance.unuse.apply(instantSearchInstance, _toConsumableArray(existingInsightsMiddlewares));\n    var _getAppIdAndApiKey = getAppIdAndApiKey(instantSearchInstance.client),\n      _getAppIdAndApiKey2 = _slicedToArray(_getAppIdAndApiKey, 2),\n      appId = _getAppIdAndApiKey2[0],\n      apiKey = _getAppIdAndApiKey2[1];\n\n    // search-insights.js also throws an error so dev-only clarification is sufficient\n    process.env.NODE_ENV === 'development' ? warning(Boolean(appId && apiKey), 'could not extract Algolia credentials from searchClient in insights middleware.') : void 0;\n    var queuedUserToken = undefined;\n    var userTokenBeforeInit = undefined;\n    if (Array.isArray(insightsClient.queue)) {\n      // Context: The umd build of search-insights is asynchronously loaded by the snippet.\n      //\n      // When user calls `aa('setUserToken', 'my-user-token')` before `search-insights` is loaded,\n      // ['setUserToken', 'my-user-token'] gets stored in `aa.queue`.\n      // Whenever `search-insights` is finally loaded, it will process the queue.\n      //\n      // But here's the reason why we handle it here:\n      // At this point, even though `search-insights` is not loaded yet,\n      // we still want to read the token from the queue.\n      // Otherwise, the first search call will be fired without the token.\n      var _ref3 = find(insightsClient.queue.slice().reverse(), function (_ref5) {\n        var _ref6 = _slicedToArray(_ref5, 1),\n          method = _ref6[0];\n        return method === 'setUserToken';\n      }) || [];\n      var _ref4 = _slicedToArray(_ref3, 2);\n      queuedUserToken = _ref4[1];\n    }\n    insightsClient('getUserToken', null, function (_error, userToken) {\n      // If user has called `aa('setUserToken', 'my-user-token')` before creating\n      // the `insights` middleware, we store them temporarily and\n      // set it later on.\n      //\n      // Otherwise, the `init` call might override it with anonymous user token.\n      userTokenBeforeInit = userToken;\n    });\n\n    // Only `init` if the `insightsInitParams` option is passed or\n    // if the `insightsClient` version doesn't supports optional `init` calling.\n    if (insightsInitParams || !isModernInsightsClient(insightsClient)) {\n      insightsClient('init', _objectSpread({\n        appId: appId,\n        apiKey: apiKey,\n        partial: true\n      }, insightsInitParams));\n    }\n    var initialParameters;\n    var helper;\n    return {\n      $$type: 'ais.insights',\n      $$internal: $$internal,\n      onStateChange: function onStateChange() {},\n      subscribe: function subscribe() {\n        if (!insightsClient.shouldAddScript) return;\n        var errorMessage = '[insights middleware]: could not load search-insights.js. Please load it manually following https://alg.li/insights-init';\n        try {\n          var script = document.createElement('script');\n          script.async = true;\n          script.src = ALGOLIA_INSIGHTS_SRC;\n          script.onerror = function () {\n            instantSearchInstance.emit('error', new Error(errorMessage));\n          };\n          document.body.appendChild(script);\n          insightsClient.shouldAddScript = false;\n        } catch (cause) {\n          insightsClient.shouldAddScript = false;\n          instantSearchInstance.emit('error', new Error(errorMessage));\n        }\n      },\n      started: function started() {\n        insightsClient('addAlgoliaAgent', 'insights-middleware');\n        helper = instantSearchInstance.helper;\n        initialParameters = {\n          userToken: helper.state.userToken,\n          clickAnalytics: helper.state.clickAnalytics\n        };\n        helper.overrideStateWithoutTriggeringChangeEvent(_objectSpread(_objectSpread({}, helper.state), {}, {\n          clickAnalytics: true\n        }));\n        if (!$$internal) {\n          instantSearchInstance.scheduleSearch();\n        }\n        var setUserTokenToSearch = function setUserTokenToSearch(userToken) {\n          var immediate = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n          if (!userToken) {\n            return;\n          }\n          var existingToken = helper.state.userToken;\n          function applyToken() {\n            helper.overrideStateWithoutTriggeringChangeEvent(_objectSpread(_objectSpread({}, helper.state), {}, {\n              userToken: userToken\n            }));\n            if (existingToken && existingToken !== userToken) {\n              instantSearchInstance.scheduleSearch();\n            }\n          }\n\n          // Delay the token application to the next render cycle\n          if (!immediate) {\n            setTimeout(applyToken, 0);\n          } else {\n            applyToken();\n          }\n        };\n        var anonymousUserToken = getInsightsAnonymousUserTokenInternal();\n        if (anonymousUserToken) {\n          // When `aa('init', { ... })` is called, it creates an anonymous user token in cookie.\n          // We can set it as userToken.\n          setUserTokenToSearch(anonymousUserToken, true);\n        }\n\n        // We consider the `userToken` coming from a `init` call to have a higher\n        // importance than the one coming from the queue.\n        if (userTokenBeforeInit) {\n          setUserTokenToSearch(userTokenBeforeInit, true);\n          insightsClient('setUserToken', userTokenBeforeInit);\n        } else if (queuedUserToken) {\n          setUserTokenToSearch(queuedUserToken, true);\n          insightsClient('setUserToken', queuedUserToken);\n        }\n\n        // This updates userToken which is set explicitly by `aa('setUserToken', userToken)`\n        insightsClient('onUserTokenChange', setUserTokenToSearch, {\n          immediate: true\n        });\n        var insightsClientWithLocalCredentials = insightsClient;\n        if (isModernInsightsClient(insightsClient)) {\n          insightsClientWithLocalCredentials = function insightsClientWithLocalCredentials(method, payload) {\n            var extraParams = {\n              headers: {\n                'X-Algolia-Application-Id': appId,\n                'X-Algolia-API-Key': apiKey\n              }\n            };\n\n            // @ts-ignore we are calling this only when we know that the client actually is correct\n            return insightsClient(method, payload, extraParams);\n          };\n        }\n        instantSearchInstance.sendEventToInsights = function (event) {\n          if (onEvent) {\n            onEvent(event, insightsClientWithLocalCredentials);\n          } else if (event.insightsMethod) {\n            // Source is used to differentiate events sent by instantsearch from those sent manually.\n            event.payload.algoliaSource = ['instantsearch'];\n            if (event.eventModifier === 'internal') {\n              event.payload.algoliaSource.push('instantsearch-internal');\n            }\n            insightsClientWithLocalCredentials(event.insightsMethod, event.payload);\n            process.env.NODE_ENV === 'development' ? warning(Boolean(helper.state.userToken), \"\\nCannot send event to Algolia Insights because `userToken` is not set.\\n\\nSee documentation: https://www.algolia.com/doc/guides/building-search-ui/going-further/send-insights-events/js/#setting-the-usertoken\\n\") : void 0;\n          } else {\n            process.env.NODE_ENV === 'development' ? warning(false, 'Cannot send event to Algolia Insights because `insightsMethod` option is missing.') : void 0;\n          }\n        };\n      },\n      unsubscribe: function unsubscribe() {\n        insightsClient('onUserTokenChange', undefined);\n        instantSearchInstance.sendEventToInsights = noop;\n        if (helper && initialParameters) {\n          helper.overrideStateWithoutTriggeringChangeEvent(_objectSpread(_objectSpread({}, helper.state), initialParameters));\n          instantSearchInstance.scheduleSearch();\n        }\n      }\n    };\n  };\n}\n\n/**\n * Determines if a given insights `client` supports the optional call to `init`\n * and the ability to set credentials via extra parameters when sending events.\n */\nfunction isModernInsightsClient(client) {\n  var _split$map = (client.version || '').split('.').map(Number),\n    _split$map2 = _slicedToArray(_split$map, 2),\n    major = _split$map2[0],\n    minor = _split$map2[1];\n\n  /* eslint-disable @typescript-eslint/naming-convention */\n  var v3 = major >= 3;\n  var v2_6 = major === 2 && minor >= 6;\n  var v1_10 = major === 1 && minor >= 10;\n  /* eslint-enable @typescript-eslint/naming-convention */\n\n  return v3 || v2_6 || v1_10;\n}","import { createInitArgs, safelyRunOnBrowser } from \"../lib/utils/index.js\";\nfunction extractWidgetPayload(widgets, instantSearchInstance, payload) {\n  var initOptions = createInitArgs(instantSearchInstance, instantSearchInstance.mainIndex, instantSearchInstance._initialUiState);\n  widgets.forEach(function (widget) {\n    var widgetParams = {};\n    if (widget.getWidgetRenderState) {\n      var renderState = widget.getWidgetRenderState(initOptions);\n      if (renderState && renderState.widgetParams) {\n        // casting, as we just earlier checked widgetParams exists, and thus an object\n        widgetParams = renderState.widgetParams;\n      }\n    }\n\n    // since we destructure in all widgets, the parameters with defaults are set to \"undefined\"\n    var params = Object.keys(widgetParams).filter(function (key) {\n      return widgetParams[key] !== undefined;\n    });\n    payload.widgets.push({\n      type: widget.$$type,\n      widgetType: widget.$$widgetType,\n      params: params\n    });\n    if (widget.$$type === 'ais.index') {\n      extractWidgetPayload(widget.getWidgets(), instantSearchInstance, payload);\n    }\n  });\n}\nexport function isMetadataEnabled() {\n  return safelyRunOnBrowser(function (_ref) {\n    var _window$navigator, _window$navigator$use;\n    var window = _ref.window;\n    return ((_window$navigator = window.navigator) === null || _window$navigator === void 0 ? void 0 : (_window$navigator$use = _window$navigator.userAgent) === null || _window$navigator$use === void 0 ? void 0 : _window$navigator$use.indexOf('Algolia Crawler')) > -1;\n  }, {\n    fallback: function fallback() {\n      return false;\n    }\n  });\n}\n\n/**\n * Exposes the metadata of mounted widgets in a custom\n * `<meta name=\"instantsearch:widgets\" />` tag. The metadata per widget is:\n * - applied parameters\n * - widget name\n * - connector name\n */\nexport function createMetadataMiddleware() {\n  var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n    _ref2$$$internal = _ref2.$$internal,\n    $$internal = _ref2$$$internal === void 0 ? false : _ref2$$$internal;\n  return function (_ref3) {\n    var instantSearchInstance = _ref3.instantSearchInstance;\n    var payload = {\n      widgets: []\n    };\n    var payloadContainer = document.createElement('meta');\n    var refNode = document.querySelector('head');\n    payloadContainer.name = 'instantsearch:widgets';\n    return {\n      $$type: 'ais.metadata',\n      $$internal: $$internal,\n      onStateChange: function onStateChange() {},\n      subscribe: function subscribe() {\n        // using setTimeout here to delay extraction until widgets have been added in a tick (e.g. Vue)\n        setTimeout(function () {\n          var client = instantSearchInstance.client;\n          payload.ua = client.transporter && client.transporter.userAgent ? client.transporter.userAgent.value : client._ua;\n          extractWidgetPayload(instantSearchInstance.mainIndex.getWidgets(), instantSearchInstance, payload);\n          instantSearchInstance.middleware.forEach(function (middleware) {\n            return payload.widgets.push({\n              middleware: true,\n              type: middleware.instance.$$type,\n              internal: middleware.instance.$$internal\n            });\n          });\n          payloadContainer.content = JSON.stringify(payload);\n          refNode.appendChild(payloadContainer);\n        }, 0);\n      },\n      started: function started() {},\n      unsubscribe: function unsubscribe() {\n        payloadContainer.remove();\n      }\n    };\n  };\n}","function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\nimport qs from 'qs';\nimport { safelyRunOnBrowser, warning } from \"../utils/index.js\";\nvar setWindowTitle = function setWindowTitle(title) {\n  if (title) {\n    // This function is only executed on browsers so we can disable this check.\n    // eslint-disable-next-line no-restricted-globals\n    window.document.title = title;\n  }\n};\nvar BrowserHistory = /*#__PURE__*/function () {\n  /**\n   * Initializes a new storage provider that syncs the search state to the URL\n   * using web APIs (`window.location.pushState` and `onpopstate` event).\n   */\n  function BrowserHistory(_ref) {\n    var _this = this;\n    var windowTitle = _ref.windowTitle,\n      _ref$writeDelay = _ref.writeDelay,\n      writeDelay = _ref$writeDelay === void 0 ? 400 : _ref$writeDelay,\n      createURL = _ref.createURL,\n      parseURL = _ref.parseURL,\n      getLocation = _ref.getLocation,\n      start = _ref.start,\n      dispose = _ref.dispose,\n      push = _ref.push;\n    _classCallCheck(this, BrowserHistory);\n    _defineProperty(this, \"$$type\", 'ais.browser');\n    /**\n     * Transforms a UI state into a title for the page.\n     */\n    _defineProperty(this, \"windowTitle\", void 0);\n    /**\n     * Time in milliseconds before performing a write in the history.\n     * It prevents from adding too many entries in the history and\n     * makes the back button more usable.\n     *\n     * @default 400\n     */\n    _defineProperty(this, \"writeDelay\", void 0);\n    /**\n     * Creates a full URL based on the route state.\n     * The storage adaptor maps all syncable keys to the query string of the URL.\n     */\n    _defineProperty(this, \"_createURL\", void 0);\n    /**\n     * Parses the URL into a route state.\n     * It should be symmetrical to `createURL`.\n     */\n    _defineProperty(this, \"parseURL\", void 0);\n    /**\n     * Returns the location to store in the history.\n     * @default () => window.location\n     */\n    _defineProperty(this, \"getLocation\", void 0);\n    _defineProperty(this, \"writeTimer\", void 0);\n    _defineProperty(this, \"_onPopState\", void 0);\n    /**\n     * Indicates if last action was back/forward in the browser.\n     */\n    _defineProperty(this, \"inPopState\", false);\n    /**\n     * Indicates whether the history router is disposed or not.\n     */\n    _defineProperty(this, \"isDisposed\", false);\n    /**\n     * Indicates the window.history.length before the last call to\n     * window.history.pushState (called in `write`).\n     * It allows to determine if a `pushState` has been triggered elsewhere,\n     * and thus to prevent the `write` method from calling `pushState`.\n     */\n    _defineProperty(this, \"latestAcknowledgedHistory\", 0);\n    _defineProperty(this, \"_start\", void 0);\n    _defineProperty(this, \"_dispose\", void 0);\n    _defineProperty(this, \"_push\", void 0);\n    this.windowTitle = windowTitle;\n    this.writeTimer = undefined;\n    this.writeDelay = writeDelay;\n    this._createURL = createURL;\n    this.parseURL = parseURL;\n    this.getLocation = getLocation;\n    this._start = start;\n    this._dispose = dispose;\n    this._push = push;\n    safelyRunOnBrowser(function (_ref2) {\n      var window = _ref2.window;\n      var title = _this.windowTitle && _this.windowTitle(_this.read());\n      setWindowTitle(title);\n      _this.latestAcknowledgedHistory = window.history.length;\n    });\n  }\n\n  /**\n   * Reads the URL and returns a syncable UI search state.\n   */\n  _createClass(BrowserHistory, [{\n    key: \"read\",\n    value: function read() {\n      return this.parseURL({\n        qsModule: qs,\n        location: this.getLocation()\n      });\n    }\n\n    /**\n     * Pushes a search state into the URL.\n     */\n  }, {\n    key: \"write\",\n    value: function write(routeState) {\n      var _this2 = this;\n      safelyRunOnBrowser(function (_ref3) {\n        var window = _ref3.window;\n        var url = _this2.createURL(routeState);\n        var title = _this2.windowTitle && _this2.windowTitle(routeState);\n        if (_this2.writeTimer) {\n          clearTimeout(_this2.writeTimer);\n        }\n        _this2.writeTimer = setTimeout(function () {\n          setWindowTitle(title);\n          if (_this2.shouldWrite(url)) {\n            if (_this2._push) {\n              _this2._push(url);\n            } else {\n              window.history.pushState(routeState, title || '', url);\n            }\n            _this2.latestAcknowledgedHistory = window.history.length;\n          }\n          _this2.inPopState = false;\n          _this2.writeTimer = undefined;\n        }, _this2.writeDelay);\n      });\n    }\n\n    /**\n     * Sets a callback on the `onpopstate` event of the history API of the current page.\n     * It enables the URL sync to keep track of the changes.\n     */\n  }, {\n    key: \"onUpdate\",\n    value: function onUpdate(callback) {\n      var _this3 = this;\n      if (this._start) {\n        this._start(function () {\n          callback(_this3.read());\n        });\n      }\n      this._onPopState = function () {\n        if (_this3.writeTimer) {\n          clearTimeout(_this3.writeTimer);\n          _this3.writeTimer = undefined;\n        }\n        _this3.inPopState = true;\n\n        // We always read the state from the URL because the state of the history\n        // can be incorect in some cases (e.g. using React Router).\n        callback(_this3.read());\n      };\n      safelyRunOnBrowser(function (_ref4) {\n        var window = _ref4.window;\n        window.addEventListener('popstate', _this3._onPopState);\n      });\n    }\n\n    /**\n     * Creates a complete URL from a given syncable UI state.\n     *\n     * It always generates the full URL, not a relative one.\n     * This allows to handle cases like using a <base href>.\n     * See: https://github.com/algolia/instantsearch/issues/790\n     */\n  }, {\n    key: \"createURL\",\n    value: function createURL(routeState) {\n      var url = this._createURL({\n        qsModule: qs,\n        routeState: routeState,\n        location: this.getLocation()\n      });\n      if (process.env.NODE_ENV === 'development') {\n        try {\n          // We just want to check if the URL is valid.\n          // eslint-disable-next-line no-new\n          new URL(url);\n        } catch (e) {\n          process.env.NODE_ENV === 'development' ? warning(false, \"The URL returned by the `createURL` function is invalid.\\nPlease make sure it returns an absolute URL to avoid issues, e.g: `https://algolia.com/search?query=iphone`.\") : void 0;\n        }\n      }\n      return url;\n    }\n\n    /**\n     * Removes the event listener and cleans up the URL.\n     */\n  }, {\n    key: \"dispose\",\n    value: function dispose() {\n      var _this4 = this;\n      if (this._dispose) {\n        this._dispose();\n      }\n      this.isDisposed = true;\n      safelyRunOnBrowser(function (_ref5) {\n        var window = _ref5.window;\n        if (_this4._onPopState) {\n          window.removeEventListener('popstate', _this4._onPopState);\n        }\n      });\n      if (this.writeTimer) {\n        clearTimeout(this.writeTimer);\n      }\n      this.write({});\n    }\n  }, {\n    key: \"start\",\n    value: function start() {\n      this.isDisposed = false;\n    }\n  }, {\n    key: \"shouldWrite\",\n    value: function shouldWrite(url) {\n      var _this5 = this;\n      return safelyRunOnBrowser(function (_ref6) {\n        var window = _ref6.window;\n        // We do want to `pushState` if:\n        // - the router is not disposed, IS.js needs to update the URL\n        // OR\n        // - the last write was from InstantSearch.js\n        // (unlike a SPA, where it would have last written)\n        var lastPushWasByISAfterDispose = !(_this5.isDisposed && _this5.latestAcknowledgedHistory !== window.history.length);\n        return (\n          // When the last state change was through popstate, the IS.js state changes,\n          // but that should not write the URL.\n          !_this5.inPopState &&\n          // When the previous pushState after dispose was by IS.js, we want to write the URL.\n          lastPushWasByISAfterDispose &&\n          // When the URL is the same as the current one, we do not want to write it.\n          url !== window.location.href\n        );\n      });\n    }\n  }]);\n  return BrowserHistory;\n}();\nexport default function historyRouter() {\n  var _ref7 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n    _ref7$createURL = _ref7.createURL,\n    createURL = _ref7$createURL === void 0 ? function (_ref8) {\n      var qsModule = _ref8.qsModule,\n        routeState = _ref8.routeState,\n        location = _ref8.location;\n      var protocol = location.protocol,\n        hostname = location.hostname,\n        _location$port = location.port,\n        port = _location$port === void 0 ? '' : _location$port,\n        pathname = location.pathname,\n        hash = location.hash;\n      var queryString = qsModule.stringify(routeState);\n      var portWithPrefix = port === '' ? '' : \":\".concat(port);\n\n      // IE <= 11 has no proper `location.origin` so we cannot rely on it.\n      if (!queryString) {\n        return \"\".concat(protocol, \"//\").concat(hostname).concat(portWithPrefix).concat(pathname).concat(hash);\n      }\n      return \"\".concat(protocol, \"//\").concat(hostname).concat(portWithPrefix).concat(pathname, \"?\").concat(queryString).concat(hash);\n    } : _ref7$createURL,\n    _ref7$parseURL = _ref7.parseURL,\n    parseURL = _ref7$parseURL === void 0 ? function (_ref9) {\n      var qsModule = _ref9.qsModule,\n        location = _ref9.location;\n      // `qs` by default converts arrays with more than 20 items to an object.\n      // We want to avoid this because the data structure manipulated can therefore vary.\n      // Setting the limit to `100` seems a good number because the engine's default is 100\n      // (it can go up to 1000 but it is very unlikely to select more than 100 items in the UI).\n      //\n      // Using an `arrayLimit` of `n` allows `n + 1` items.\n      //\n      // See:\n      //   - https://github.com/ljharb/qs#parsing-arrays\n      //   - https://www.algolia.com/doc/api-reference/api-parameters/maxValuesPerFacet/\n      return qsModule.parse(location.search.slice(1), {\n        arrayLimit: 99\n      });\n    } : _ref7$parseURL,\n    _ref7$writeDelay = _ref7.writeDelay,\n    writeDelay = _ref7$writeDelay === void 0 ? 400 : _ref7$writeDelay,\n    windowTitle = _ref7.windowTitle,\n    _ref7$getLocation = _ref7.getLocation,\n    getLocation = _ref7$getLocation === void 0 ? function () {\n      return safelyRunOnBrowser(function (_ref10) {\n        var window = _ref10.window;\n        return window.location;\n      }, {\n        fallback: function fallback() {\n          throw new Error('You need to provide `getLocation` to the `history` router in environments where `window` does not exist.');\n        }\n      });\n    } : _ref7$getLocation,\n    start = _ref7.start,\n    dispose = _ref7.dispose,\n    push = _ref7.push;\n  return new BrowserHistory({\n    createURL: createURL,\n    parseURL: parseURL,\n    writeDelay: writeDelay,\n    windowTitle: windowTitle,\n    getLocation: getLocation,\n    start: start,\n    dispose: dispose,\n    push: push\n  });\n}","function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nvar _excluded = [\"configure\"];\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\nfunction getIndexStateWithoutConfigure(uiState) {\n  var configure = uiState.configure,\n    trackedUiState = _objectWithoutProperties(uiState, _excluded);\n  return trackedUiState;\n}\n\n// technically a URL could contain any key, since users provide it,\n// which is why the input to this function is UiState, not something\n// which excludes \"configure\" as this function does.\nexport default function simpleStateMapping() {\n  return {\n    $$type: 'ais.simple',\n    stateToRoute: function stateToRoute(uiState) {\n      return Object.keys(uiState).reduce(function (state, indexId) {\n        return _objectSpread(_objectSpread({}, state), {}, _defineProperty({}, indexId, getIndexStateWithoutConfigure(uiState[indexId])));\n      }, {});\n    },\n    routeToState: function routeToState() {\n      var routeState = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n      return Object.keys(routeState).reduce(function (state, indexId) {\n        return _objectSpread(_objectSpread({}, state), {}, _defineProperty({}, indexId, getIndexStateWithoutConfigure(routeState[indexId])));\n      }, {});\n    }\n  };\n}","function isPrimitive(obj) {\n  return obj !== Object(obj);\n}\nexport function isEqual(first, second) {\n  if (first === second) {\n    return true;\n  }\n  if (isPrimitive(first) || isPrimitive(second) || typeof first === 'function' || typeof second === 'function') {\n    return first === second;\n  }\n  if (Object.keys(first).length !== Object.keys(second).length) {\n    return false;\n  }\n\n  // @TODO avoid for..of because of the large polyfill\n  // eslint-disable-next-line no-restricted-syntax\n  for (var _i = 0, _Object$keys = Object.keys(first); _i < _Object$keys.length; _i++) {\n    var key = _Object$keys[_i];\n    if (!(key in second)) {\n      return false;\n    }\n    if (!isEqual(first[key], second[key])) {\n      return false;\n    }\n  }\n  return true;\n}","function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\nimport historyRouter from \"../lib/routers/history.js\";\nimport simpleStateMapping from \"../lib/stateMappings/simple.js\";\nimport { isEqual } from \"../lib/utils/index.js\";\nexport var createRouterMiddleware = function createRouterMiddleware() {\n  var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n  var _props$router = props.router,\n    router = _props$router === void 0 ? historyRouter() : _props$router,\n    _props$stateMapping = props.stateMapping,\n    stateMapping = _props$stateMapping === void 0 ? simpleStateMapping() : _props$stateMapping,\n    _props$$$internal = props.$$internal,\n    $$internal = _props$$$internal === void 0 ? false : _props$$$internal;\n  return function (_ref) {\n    var instantSearchInstance = _ref.instantSearchInstance;\n    function topLevelCreateURL(nextState) {\n      var previousUiState =\n      // If only the mainIndex is initialized, we don't yet know what other\n      // index widgets are used. Therefore we fall back to the initialUiState.\n      // We can't indiscriminately use the initialUiState because then we\n      // reintroduce state that was changed by the user.\n      // When there are no widgets, we are sure the user can't yet have made\n      // any changes.\n      instantSearchInstance.mainIndex.getWidgets().length === 0 ? instantSearchInstance._initialUiState : instantSearchInstance.mainIndex.getWidgetUiState({});\n      var uiState = Object.keys(nextState).reduce(function (acc, indexId) {\n        return _objectSpread(_objectSpread({}, acc), {}, _defineProperty({}, indexId, nextState[indexId]));\n      }, previousUiState);\n      var route = stateMapping.stateToRoute(uiState);\n      return router.createURL(route);\n    }\n\n    // casting to UiState here to keep createURL unaware of custom UiState\n    // (as long as it's an object, it's ok)\n    instantSearchInstance._createURL = topLevelCreateURL;\n    var lastRouteState = undefined;\n    var initialUiState = instantSearchInstance._initialUiState;\n    return {\n      $$type: \"ais.router({router:\".concat(router.$$type || '__unknown__', \", stateMapping:\").concat(stateMapping.$$type || '__unknown__', \"})\"),\n      $$internal: $$internal,\n      onStateChange: function onStateChange(_ref2) {\n        var uiState = _ref2.uiState;\n        var routeState = stateMapping.stateToRoute(uiState);\n        if (lastRouteState === undefined || !isEqual(lastRouteState, routeState)) {\n          router.write(routeState);\n          lastRouteState = routeState;\n        }\n      },\n      subscribe: function subscribe() {\n        instantSearchInstance._initialUiState = _objectSpread(_objectSpread({}, initialUiState), stateMapping.routeToState(router.read()));\n        router.onUpdate(function (route) {\n          if (instantSearchInstance.mainIndex.getWidgets().length > 0) {\n            instantSearchInstance.setUiState(stateMapping.routeToState(route));\n          }\n        });\n      },\n      started: function started() {\n        var _router$start;\n        (_router$start = router.start) === null || _router$start === void 0 ? void 0 : _router$start.call(router);\n      },\n      unsubscribe: function unsubscribe() {\n        router.dispose();\n      }\n    };\n  };\n};","var NAMESPACE = 'ais';\nexport var component = function component(componentName) {\n  return function () {\n    var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n      descendantName = _ref.descendantName,\n      modifierName = _ref.modifierName;\n    var descendent = descendantName ? \"-\".concat(descendantName) : '';\n    var modifier = modifierName ? \"--\".concat(modifierName) : '';\n    return \"\".concat(NAMESPACE, \"-\").concat(componentName).concat(descendent).concat(modifier);\n  };\n};","export function getPropertyByPath(object, path) {\n  var parts = Array.isArray(path) ? path : path.split('.');\n  return parts.reduce(function (current, key) {\n    return current && current[key];\n  }, object);\n}","import { component } from \"../lib/suit.js\";\nimport { getPropertyByPath, TAG_REPLACEMENT, warning } from \"../lib/utils/index.js\";\nvar suit = component('Highlight');\n\n/**\n * @deprecated use html tagged templates and the Highlight component instead\n */\nexport default function highlight(_ref) {\n  var attribute = _ref.attribute,\n    _ref$highlightedTagNa = _ref.highlightedTagName,\n    highlightedTagName = _ref$highlightedTagNa === void 0 ? 'mark' : _ref$highlightedTagNa,\n    hit = _ref.hit,\n    _ref$cssClasses = _ref.cssClasses,\n    cssClasses = _ref$cssClasses === void 0 ? {} : _ref$cssClasses;\n  process.env.NODE_ENV === 'development' ? warning(false, \"`instantsearch.highlight` function has been deprecated. It is still supported in 4.x releases, but not further. It is replaced by the `Highlight` component.\\n\\nFor more information, visit https://www.algolia.com/doc/guides/building-search-ui/upgrade-guides/js/?client=html+tagged+templates#upgrade-templates\") : void 0;\n  var highlightAttributeResult = getPropertyByPath(hit._highlightResult, attribute);\n\n  // @MAJOR fallback to attribute value if highlight is not found\n  process.env.NODE_ENV === 'development' ? warning(highlightAttributeResult, \"Could not enable highlight for \\\"\".concat(attribute, \"\\\", will display an empty string.\\nPlease check whether this attribute exists and is either searchable or specified in `attributesToHighlight`.\\n\\nSee: https://alg.li/highlighting\\n\")) : void 0;\n  var _ref2 = highlightAttributeResult || {},\n    _ref2$value = _ref2.value,\n    attributeValue = _ref2$value === void 0 ? '' : _ref2$value;\n\n  // cx is not used, since it would be bundled as a dependency for Vue & Angular\n  var className = suit({\n    descendantName: 'highlighted'\n  }) + (cssClasses.highlighted ? \" \".concat(cssClasses.highlighted) : '');\n  return attributeValue.replace(new RegExp(TAG_REPLACEMENT.highlightPreTag, 'g'), \"<\".concat(highlightedTagName, \" class=\\\"\").concat(className, \"\\\">\")).replace(new RegExp(TAG_REPLACEMENT.highlightPostTag, 'g'), \"</\".concat(highlightedTagName, \">\"));\n}","import { TAG_REPLACEMENT } from \"./escape-highlight.js\";\nexport function concatHighlightedParts(parts) {\n  var highlightPreTag = TAG_REPLACEMENT.highlightPreTag,\n    highlightPostTag = TAG_REPLACEMENT.highlightPostTag;\n  return parts.map(function (part) {\n    return part.isHighlighted ? highlightPreTag + part.value + highlightPostTag : part.value;\n  }).join('');\n}","import { unescape } from \"./escape-html.js\";\nvar hasAlphanumeric = new RegExp(/\\w/i);\nexport function getHighlightFromSiblings(parts, i) {\n  var _parts, _parts2;\n  var current = parts[i];\n  var isNextHighlighted = ((_parts = parts[i + 1]) === null || _parts === void 0 ? void 0 : _parts.isHighlighted) || true;\n  var isPreviousHighlighted = ((_parts2 = parts[i - 1]) === null || _parts2 === void 0 ? void 0 : _parts2.isHighlighted) || true;\n  if (!hasAlphanumeric.test(unescape(current.value)) && isPreviousHighlighted === isNextHighlighted) {\n    return isPreviousHighlighted;\n  }\n  return current.isHighlighted;\n}","function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\nimport { getHighlightFromSiblings } from \"./getHighlightFromSiblings.js\";\nexport function reverseHighlightedParts(parts) {\n  if (!parts.some(function (part) {\n    return part.isHighlighted;\n  })) {\n    return parts.map(function (part) {\n      return _objectSpread(_objectSpread({}, part), {}, {\n        isHighlighted: false\n      });\n    });\n  }\n  return parts.map(function (part, i) {\n    return _objectSpread(_objectSpread({}, part), {}, {\n      isHighlighted: !getHighlightFromSiblings(parts, i)\n    });\n  });\n}","import { TAG_REPLACEMENT } from \"./escape-highlight.js\";\nexport function getHighlightedParts(highlightedValue) {\n  // @MAJOR: this should use TAG_PLACEHOLDER\n  var highlightPostTag = TAG_REPLACEMENT.highlightPostTag,\n    highlightPreTag = TAG_REPLACEMENT.highlightPreTag;\n  var splitByPreTag = highlightedValue.split(highlightPreTag);\n  var firstValue = splitByPreTag.shift();\n  var elements = !firstValue ? [] : [{\n    value: firstValue,\n    isHighlighted: false\n  }];\n  splitByPreTag.forEach(function (split) {\n    var splitByPostTag = split.split(highlightPostTag);\n    elements.push({\n      value: splitByPostTag[0],\n      isHighlighted: true\n    });\n    if (splitByPostTag[1] !== '') {\n      elements.push({\n        value: splitByPostTag[1],\n        isHighlighted: false\n      });\n    }\n  });\n  return elements;\n}","import { component } from \"../lib/suit.js\";\nimport { TAG_REPLACEMENT, getPropertyByPath, getHighlightedParts, reverseHighlightedParts, concatHighlightedParts, warning } from \"../lib/utils/index.js\";\nvar suit = component('ReverseHighlight');\n\n/**\n * @deprecated use html tagged templates and the ReverseHighlight component instead\n */\nexport default function reverseHighlight(_ref) {\n  var attribute = _ref.attribute,\n    _ref$highlightedTagNa = _ref.highlightedTagName,\n    highlightedTagName = _ref$highlightedTagNa === void 0 ? 'mark' : _ref$highlightedTagNa,\n    hit = _ref.hit,\n    _ref$cssClasses = _ref.cssClasses,\n    cssClasses = _ref$cssClasses === void 0 ? {} : _ref$cssClasses;\n  process.env.NODE_ENV === 'development' ? warning(false, \"`instantsearch.reverseHighlight` function has been deprecated. It is still supported in 4.x releases, but not further. It is replaced by the `ReverseHighlight` component.\\n\\nFor more information, visit https://www.algolia.com/doc/guides/building-search-ui/upgrade-guides/js/?client=html+tagged+templates#upgrade-templates\") : void 0;\n  var highlightAttributeResult = getPropertyByPath(hit._highlightResult, attribute);\n\n  // @MAJOR fallback to attribute value if highlight is not found\n  process.env.NODE_ENV === 'development' ? warning(highlightAttributeResult, \"Could not enable reverse highlight for \\\"\".concat(attribute, \"\\\", will display an empty string.\\nPlease check whether this attribute exists and is either searchable or specified in `attributesToHighlight`.\\n\\nSee: https://alg.li/highlighting\\n\")) : void 0;\n  var _ref2 = highlightAttributeResult || {},\n    _ref2$value = _ref2.value,\n    attributeValue = _ref2$value === void 0 ? '' : _ref2$value;\n\n  // cx is not used, since it would be bundled as a dependency for Vue & Angular\n  var className = suit({\n    descendantName: 'highlighted'\n  }) + (cssClasses.highlighted ? \" \".concat(cssClasses.highlighted) : '');\n  var reverseHighlightedValue = concatHighlightedParts(reverseHighlightedParts(getHighlightedParts(attributeValue)));\n  return reverseHighlightedValue.replace(new RegExp(TAG_REPLACEMENT.highlightPreTag, 'g'), \"<\".concat(highlightedTagName, \" class=\\\"\").concat(className, \"\\\">\")).replace(new RegExp(TAG_REPLACEMENT.highlightPostTag, 'g'), \"</\".concat(highlightedTagName, \">\"));\n}","import { component } from \"../lib/suit.js\";\nimport { TAG_REPLACEMENT, getPropertyByPath, warning } from \"../lib/utils/index.js\";\nvar suit = component('Snippet');\n\n/**\n * @deprecated use html tagged templates and the Snippet component instead\n */\nexport default function snippet(_ref) {\n  var attribute = _ref.attribute,\n    _ref$highlightedTagNa = _ref.highlightedTagName,\n    highlightedTagName = _ref$highlightedTagNa === void 0 ? 'mark' : _ref$highlightedTagNa,\n    hit = _ref.hit,\n    _ref$cssClasses = _ref.cssClasses,\n    cssClasses = _ref$cssClasses === void 0 ? {} : _ref$cssClasses;\n  process.env.NODE_ENV === 'development' ? warning(false, \"`instantsearch.snippet` function has been deprecated. It is still supported in 4.x releases, but not further. It is replaced by the `Snippet` component.\\n\\nFor more information, visit https://www.algolia.com/doc/guides/building-search-ui/upgrade-guides/js/?client=html+tagged+templates#upgrade-templates\") : void 0;\n  var snippetAttributeResult = getPropertyByPath(hit._snippetResult, attribute);\n\n  // @MAJOR fallback to attribute value if snippet is not found\n  process.env.NODE_ENV === 'development' ? warning(snippetAttributeResult, \"Could not enable snippet for \\\"\".concat(attribute, \"\\\", will display an empty string.\\nPlease check whether this attribute exists and is specified in `attributesToSnippet`.\\n\\nSee: https://alg.li/highlighting\\n\")) : void 0;\n  var _ref2 = snippetAttributeResult || {},\n    _ref2$value = _ref2.value,\n    attributeValue = _ref2$value === void 0 ? '' : _ref2$value;\n\n  // cx is not used, since it would be bundled as a dependency for Vue & Angular\n  var className = suit({\n    descendantName: 'highlighted'\n  }) + (cssClasses.highlighted ? \" \".concat(cssClasses.highlighted) : '');\n  return attributeValue.replace(new RegExp(TAG_REPLACEMENT.highlightPreTag, 'g'), \"<\".concat(highlightedTagName, \" class=\\\"\").concat(className, \"\\\">\")).replace(new RegExp(TAG_REPLACEMENT.highlightPostTag, 'g'), \"</\".concat(highlightedTagName, \">\"));\n}","import { component } from \"../lib/suit.js\";\nimport { TAG_REPLACEMENT, getPropertyByPath, getHighlightedParts, reverseHighlightedParts, concatHighlightedParts, warning } from \"../lib/utils/index.js\";\nvar suit = component('ReverseSnippet');\n\n/**\n * @deprecated use html tagged templates and the ReverseSnippet component instead\n */\nexport default function reverseSnippet(_ref) {\n  var attribute = _ref.attribute,\n    _ref$highlightedTagNa = _ref.highlightedTagName,\n    highlightedTagName = _ref$highlightedTagNa === void 0 ? 'mark' : _ref$highlightedTagNa,\n    hit = _ref.hit,\n    _ref$cssClasses = _ref.cssClasses,\n    cssClasses = _ref$cssClasses === void 0 ? {} : _ref$cssClasses;\n  process.env.NODE_ENV === 'development' ? warning(false, \"`instantsearch.reverseSnippet` function has been deprecated. It is still supported in 4.x releases, but not further. It is replaced by the `ReverseSnippet` component.\\n\\nFor more information, visit https://www.algolia.com/doc/guides/building-search-ui/upgrade-guides/js/?client=html+tagged+templates#upgrade-templates\") : void 0;\n  var snippetAttributeResult = getPropertyByPath(hit._snippetResult, attribute);\n\n  // @MAJOR fallback to attribute value if snippet is not found\n  process.env.NODE_ENV === 'development' ? warning(snippetAttributeResult, \"Could not enable reverse snippet for \\\"\".concat(attribute, \"\\\", will display an empty string.\\nPlease check whether this attribute exists and is specified in `attributesToSnippet`.\\n\\nSee: https://alg.li/highlighting\\n\")) : void 0;\n  var _ref2 = snippetAttributeResult || {},\n    _ref2$value = _ref2.value,\n    attributeValue = _ref2$value === void 0 ? '' : _ref2$value;\n\n  // cx is not used, since it would be bundled as a dependency for Vue & Angular\n  var className = suit({\n    descendantName: 'highlighted'\n  }) + (cssClasses.highlighted ? \" \".concat(cssClasses.highlighted) : '');\n  var reverseHighlightedValue = concatHighlightedParts(reverseHighlightedParts(getHighlightedParts(attributeValue)));\n  return reverseHighlightedValue.replace(new RegExp(TAG_REPLACEMENT.highlightPreTag, 'g'), \"<\".concat(highlightedTagName, \" class=\\\"\").concat(className, \"\\\">\")).replace(new RegExp(TAG_REPLACEMENT.highlightPostTag, 'g'), \"</\".concat(highlightedTagName, \">\"));\n}","function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nimport { warning, serializePayload, deserializePayload } from \"../lib/utils/index.js\";\n/** @deprecated use bindEvent instead */\nexport function readDataAttributes(domElement) {\n  var method = domElement.getAttribute('data-insights-method');\n  var serializedPayload = domElement.getAttribute('data-insights-payload');\n  if (typeof serializedPayload !== 'string') {\n    throw new Error('The insights helper expects `data-insights-payload` to be a base64-encoded JSON string.');\n  }\n  try {\n    var payload = deserializePayload(serializedPayload);\n    return {\n      method: method,\n      payload: payload\n    };\n  } catch (error) {\n    throw new Error('The insights helper was unable to parse `data-insights-payload`.');\n  }\n}\n\n/** @deprecated use bindEvent instead */\nexport function writeDataAttributes(_ref) {\n  var method = _ref.method,\n    payload = _ref.payload;\n  if (_typeof(payload) !== 'object') {\n    throw new Error(\"The insights helper expects the payload to be an object.\");\n  }\n  var serializedPayload;\n  try {\n    serializedPayload = serializePayload(payload);\n  } catch (error) {\n    throw new Error(\"Could not JSON serialize the payload object.\");\n  }\n  return \"data-insights-method=\\\"\".concat(method, \"\\\" data-insights-payload=\\\"\").concat(serializedPayload, \"\\\"\");\n}\n\n/**\n * @deprecated This function will be still supported in 4.x releases, but not further. It is replaced by the `insights` middleware. For more information, visit https://www.algolia.com/doc/guides/getting-insights-and-analytics/search-analytics/click-through-and-conversions/how-to/send-click-and-conversion-events-with-instantsearch/js/\n */\nexport default function insights(method, payload) {\n  process.env.NODE_ENV === 'development' ? warning(false, \"`insights` function has been deprecated. It is still supported in 4.x releases, but not further. It is replaced by the `insights` middleware.\\n\\nFor more information, visit https://www.algolia.com/doc/guides/getting-insights-and-analytics/search-analytics/click-through-and-conversions/how-to/send-click-and-conversion-events-with-instantsearch/js/\") : void 0;\n  return writeDataAttributes({\n    method: method,\n    payload: payload\n  });\n}","function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\nimport { highlight as _highlight, reverseHighlight as _reverseHighlight, snippet as _snippet, reverseSnippet as _reverseSnippet, insights as _insights } from \"../helpers/index.js\";\nimport { formatNumber as _formatNumber } from \"./formatNumber.js\";\nexport default function hoganHelpers(_ref) {\n  var numberLocale = _ref.numberLocale;\n  return {\n    formatNumber: function formatNumber(value, render) {\n      return _formatNumber(Number(render(value)), numberLocale);\n    },\n    highlight: function highlight(options, render) {\n      try {\n        var highlightOptions = JSON.parse(options);\n        return render(_highlight(_objectSpread(_objectSpread({}, highlightOptions), {}, {\n          hit: this\n        })));\n      } catch (error) {\n        throw new Error(\"\\nThe highlight helper expects a JSON object of the format:\\n{ \\\"attribute\\\": \\\"name\\\", \\\"highlightedTagName\\\": \\\"mark\\\" }\");\n      }\n    },\n    reverseHighlight: function reverseHighlight(options, render) {\n      try {\n        var reverseHighlightOptions = JSON.parse(options);\n        return render(_reverseHighlight(_objectSpread(_objectSpread({}, reverseHighlightOptions), {}, {\n          hit: this\n        })));\n      } catch (error) {\n        throw new Error(\"\\n  The reverseHighlight helper expects a JSON object of the format:\\n  { \\\"attribute\\\": \\\"name\\\", \\\"highlightedTagName\\\": \\\"mark\\\" }\");\n      }\n    },\n    snippet: function snippet(options, render) {\n      try {\n        var snippetOptions = JSON.parse(options);\n        return render(_snippet(_objectSpread(_objectSpread({}, snippetOptions), {}, {\n          hit: this\n        })));\n      } catch (error) {\n        throw new Error(\"\\nThe snippet helper expects a JSON object of the format:\\n{ \\\"attribute\\\": \\\"name\\\", \\\"highlightedTagName\\\": \\\"mark\\\" }\");\n      }\n    },\n    reverseSnippet: function reverseSnippet(options, render) {\n      try {\n        var reverseSnippetOptions = JSON.parse(options);\n        return render(_reverseSnippet(_objectSpread(_objectSpread({}, reverseSnippetOptions), {}, {\n          hit: this\n        })));\n      } catch (error) {\n        throw new Error(\"\\n  The reverseSnippet helper expects a JSON object of the format:\\n  { \\\"attribute\\\": \\\"name\\\", \\\"highlightedTagName\\\": \\\"mark\\\" }\");\n      }\n    },\n    insights: function insights(options, render) {\n      try {\n        var _JSON$parse = JSON.parse(options),\n          method = _JSON$parse.method,\n          payload = _JSON$parse.payload;\n        return render(_insights(method, _objectSpread({\n          objectIDs: [this.objectID]\n        }, payload)));\n      } catch (error) {\n        throw new Error(\"\\nThe insights helper expects a JSON object of the format:\\n{ \\\"method\\\": \\\"method-name\\\", \\\"payload\\\": { \\\"eventName\\\": \\\"name of the event\\\" } }\");\n      }\n    }\n  };\n}","export function formatNumber(value, numberLocale) {\n  return value.toLocaleString(numberLocale);\n}","var nextMicroTask = Promise.resolve();\nexport function defer(callback) {\n  var progress = null;\n  var cancelled = false;\n  var fn = function fn() {\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n    if (progress !== null) {\n      return;\n    }\n    progress = nextMicroTask.then(function () {\n      progress = null;\n      if (cancelled) {\n        cancelled = false;\n        return;\n      }\n      callback.apply(void 0, args);\n    });\n  };\n  fn.wait = function () {\n    if (progress === null) {\n      throw new Error('The deferred function should be called before calling `wait()`');\n    }\n    return progress;\n  };\n  fn.cancel = function () {\n    if (progress === null) {\n      return;\n    }\n    cancelled = true;\n  };\n  return fn;\n}","import { checkIndexUiState } from \"./checkIndexUiState.js\";\nimport { isIndexWidget } from \"./isIndexWidget.js\";\nexport function setIndexHelperState(finalUiState, indexWidget) {\n  var nextIndexUiState = finalUiState[indexWidget.getIndexId()] || {};\n  if (process.env.NODE_ENV === 'development') {\n    checkIndexUiState({\n      index: indexWidget,\n      indexUiState: nextIndexUiState\n    });\n  }\n  indexWidget.getHelper().setState(indexWidget.getWidgetSearchParameters(indexWidget.getHelper().state, {\n    uiState: nextIndexUiState\n  }));\n  indexWidget.getWidgets().filter(isIndexWidget).forEach(function (widget) {\n    return setIndexHelperState(finalUiState, widget);\n  });\n}","function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, \"prototype\", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } else if (call !== void 0) { throw new TypeError(\"Derived constructors may only return object or undefined\"); } return _assertThisInitialized(self); }\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\nimport EventEmitter from '@algolia/events';\nimport algoliasearchHelper from 'algoliasearch-helper';\nimport { createInsightsMiddleware } from \"../middlewares/createInsightsMiddleware.js\";\nimport { createMetadataMiddleware, isMetadataEnabled } from \"../middlewares/createMetadataMiddleware.js\";\nimport { createRouterMiddleware } from \"../middlewares/createRouterMiddleware.js\";\nimport index from \"../widgets/index/index.js\";\nimport createHelpers from \"./createHelpers.js\";\nimport { createDocumentationMessageGenerator, createDocumentationLink, defer, noop, warning, setIndexHelperState, isIndexWidget } from \"./utils/index.js\";\nimport version from \"./version.js\";\nvar withUsage = createDocumentationMessageGenerator({\n  name: 'instantsearch'\n});\nfunction defaultCreateURL() {\n  return '#';\n}\n\n// this purposely breaks typescript's type inference to ensure it's not used\n// as it's used for a default parameter for example\n// source: https://github.com/Microsoft/TypeScript/issues/14829#issuecomment-504042546\n/**\n * Global options for an InstantSearch instance.\n */\n/**\n * The actual implementation of the InstantSearch. This is\n * created using the `instantsearch` factory function.\n * It emits the 'render' event every time a search is done\n */\nvar InstantSearch = /*#__PURE__*/function (_EventEmitter) {\n  _inherits(InstantSearch, _EventEmitter);\n  var _super = _createSuper(InstantSearch);\n  function InstantSearch(options) {\n    var _this;\n    _classCallCheck(this, InstantSearch);\n    _this = _super.call(this);\n\n    // prevent `render` event listening from causing a warning\n    _defineProperty(_assertThisInitialized(_this), \"client\", void 0);\n    _defineProperty(_assertThisInitialized(_this), \"indexName\", void 0);\n    _defineProperty(_assertThisInitialized(_this), \"insightsClient\", void 0);\n    _defineProperty(_assertThisInitialized(_this), \"onStateChange\", null);\n    _defineProperty(_assertThisInitialized(_this), \"helper\", void 0);\n    _defineProperty(_assertThisInitialized(_this), \"mainHelper\", void 0);\n    _defineProperty(_assertThisInitialized(_this), \"mainIndex\", void 0);\n    _defineProperty(_assertThisInitialized(_this), \"started\", void 0);\n    _defineProperty(_assertThisInitialized(_this), \"templatesConfig\", void 0);\n    _defineProperty(_assertThisInitialized(_this), \"renderState\", {});\n    _defineProperty(_assertThisInitialized(_this), \"_stalledSearchDelay\", void 0);\n    _defineProperty(_assertThisInitialized(_this), \"_searchStalledTimer\", void 0);\n    _defineProperty(_assertThisInitialized(_this), \"_initialUiState\", void 0);\n    _defineProperty(_assertThisInitialized(_this), \"_initialResults\", void 0);\n    _defineProperty(_assertThisInitialized(_this), \"_createURL\", void 0);\n    _defineProperty(_assertThisInitialized(_this), \"_searchFunction\", void 0);\n    _defineProperty(_assertThisInitialized(_this), \"_mainHelperSearch\", void 0);\n    _defineProperty(_assertThisInitialized(_this), \"middleware\", []);\n    _defineProperty(_assertThisInitialized(_this), \"sendEventToInsights\", void 0);\n    /**\n     * The status of the search. Can be \"idle\", \"loading\", \"stalled\", or \"error\".\n     */\n    _defineProperty(_assertThisInitialized(_this), \"status\", 'idle');\n    /**\n     * The last returned error from the Search API.\n     * The error gets cleared when the next valid search response is rendered.\n     */\n    _defineProperty(_assertThisInitialized(_this), \"error\", undefined);\n    _defineProperty(_assertThisInitialized(_this), \"scheduleSearch\", defer(function () {\n      if (_this.started) {\n        _this.mainHelper.search();\n      }\n    }));\n    _defineProperty(_assertThisInitialized(_this), \"scheduleRender\", defer(function () {\n      var _this$mainHelper;\n      var shouldResetStatus = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n      if (!((_this$mainHelper = _this.mainHelper) !== null && _this$mainHelper !== void 0 && _this$mainHelper.hasPendingRequests())) {\n        clearTimeout(_this._searchStalledTimer);\n        _this._searchStalledTimer = null;\n        if (shouldResetStatus) {\n          _this.status = 'idle';\n          _this.error = undefined;\n        }\n      }\n      _this.mainIndex.render({\n        instantSearchInstance: _assertThisInitialized(_this)\n      });\n      _this.emit('render');\n    }));\n    _defineProperty(_assertThisInitialized(_this), \"onInternalStateChange\", defer(function () {\n      var nextUiState = _this.mainIndex.getWidgetUiState({});\n      _this.middleware.forEach(function (_ref) {\n        var instance = _ref.instance;\n        instance.onStateChange({\n          uiState: nextUiState\n        });\n      });\n    }));\n    _this.setMaxListeners(100);\n    var _options$indexName = options.indexName,\n      indexName = _options$indexName === void 0 ? '' : _options$indexName,\n      numberLocale = options.numberLocale,\n      _options$initialUiSta = options.initialUiState,\n      initialUiState = _options$initialUiSta === void 0 ? {} : _options$initialUiSta,\n      _options$routing = options.routing,\n      routing = _options$routing === void 0 ? null : _options$routing,\n      _options$insights = options.insights,\n      insights = _options$insights === void 0 ? false : _options$insights,\n      searchFunction = options.searchFunction,\n      _options$stalledSearc = options.stalledSearchDelay,\n      stalledSearchDelay = _options$stalledSearc === void 0 ? 200 : _options$stalledSearc,\n      _options$searchClient = options.searchClient,\n      searchClient = _options$searchClient === void 0 ? null : _options$searchClient,\n      _options$insightsClie = options.insightsClient,\n      insightsClient = _options$insightsClie === void 0 ? null : _options$insightsClie,\n      _options$onStateChang = options.onStateChange,\n      onStateChange = _options$onStateChang === void 0 ? null : _options$onStateChang;\n    if (searchClient === null) {\n      throw new Error(withUsage('The `searchClient` option is required.'));\n    }\n    if (typeof searchClient.search !== 'function') {\n      throw new Error(\"The `searchClient` must implement a `search` method.\\n\\nSee: https://www.algolia.com/doc/guides/building-search-ui/going-further/backend-search/in-depth/backend-instantsearch/js/\");\n    }\n    if (typeof searchClient.addAlgoliaAgent === 'function') {\n      searchClient.addAlgoliaAgent(\"instantsearch.js (\".concat(version, \")\"));\n    }\n    process.env.NODE_ENV === 'development' ? warning(insightsClient === null, \"`insightsClient` property has been deprecated. It is still supported in 4.x releases, but not further. It is replaced by the `insights` middleware.\\n\\nFor more information, visit https://www.algolia.com/doc/guides/getting-insights-and-analytics/search-analytics/click-through-and-conversions/how-to/send-click-and-conversion-events-with-instantsearch/js/\") : void 0;\n    if (insightsClient && typeof insightsClient !== 'function') {\n      throw new Error(withUsage('The `insightsClient` option should be a function.'));\n    }\n    process.env.NODE_ENV === 'development' ? warning(!options.searchParameters, \"The `searchParameters` option is deprecated and will not be supported in InstantSearch.js 4.x.\\n\\nYou can replace it with the `configure` widget:\\n\\n```\\nsearch.addWidgets([\\n  configure(\".concat(JSON.stringify(options.searchParameters, null, 2), \")\\n]);\\n```\\n\\nSee \").concat(createDocumentationLink({\n      name: 'configure'\n    }))) : void 0;\n    _this.client = searchClient;\n    _this.insightsClient = insightsClient;\n    _this.indexName = indexName;\n    _this.helper = null;\n    _this.mainHelper = null;\n    _this.mainIndex = index({\n      indexName: indexName\n    });\n    _this.onStateChange = onStateChange;\n    _this.started = false;\n    _this.templatesConfig = {\n      helpers: createHelpers({\n        numberLocale: numberLocale\n      }),\n      compileOptions: {}\n    };\n    _this._stalledSearchDelay = stalledSearchDelay;\n    _this._searchStalledTimer = null;\n    _this._createURL = defaultCreateURL;\n    _this._initialUiState = initialUiState;\n    _this._initialResults = null;\n    if (searchFunction) {\n      process.env.NODE_ENV === 'development' ? warning(false, \"The `searchFunction` option is deprecated. Use `onStateChange` instead.\") : void 0;\n      _this._searchFunction = searchFunction;\n    }\n    _this.sendEventToInsights = noop;\n    if (routing) {\n      var routerOptions = typeof routing === 'boolean' ? {} : routing;\n      routerOptions.$$internal = true;\n      _this.use(createRouterMiddleware(routerOptions));\n    }\n\n    // This is the default middleware,\n    // any user-provided middleware will be added later and override this one.\n    if (insights) {\n      var insightsOptions = typeof insights === 'boolean' ? {} : insights;\n      insightsOptions.$$internal = true;\n      _this.use(createInsightsMiddleware(insightsOptions));\n    }\n    if (isMetadataEnabled()) {\n      _this.use(createMetadataMiddleware({\n        $$internal: true\n      }));\n    }\n    return _this;\n  }\n\n  /**\n   * Hooks a middleware into the InstantSearch lifecycle.\n   */\n  _createClass(InstantSearch, [{\n    key: \"_isSearchStalled\",\n    get:\n    /**\n     * @deprecated use `status === 'stalled'` instead\n     */\n    function get() {\n      process.env.NODE_ENV === 'development' ? warning(false, \"`InstantSearch._isSearchStalled` is deprecated and will be removed in InstantSearch.js 5.0.\\n\\nUse `InstantSearch.status === \\\"stalled\\\"` instead.\") : void 0;\n      return this.status === 'stalled';\n    }\n  }, {\n    key: \"use\",\n    value: function use() {\n      var _this2 = this;\n      for (var _len = arguments.length, middleware = new Array(_len), _key = 0; _key < _len; _key++) {\n        middleware[_key] = arguments[_key];\n      }\n      var newMiddlewareList = middleware.map(function (fn) {\n        var newMiddleware = _objectSpread({\n          $$type: '__unknown__',\n          $$internal: false,\n          subscribe: noop,\n          started: noop,\n          unsubscribe: noop,\n          onStateChange: noop\n        }, fn({\n          instantSearchInstance: _this2\n        }));\n        _this2.middleware.push({\n          creator: fn,\n          instance: newMiddleware\n        });\n        return newMiddleware;\n      });\n\n      // If the instance has already started, we directly subscribe the\n      // middleware so they're notified of changes.\n      if (this.started) {\n        newMiddlewareList.forEach(function (m) {\n          m.subscribe();\n          m.started();\n        });\n      }\n      return this;\n    }\n\n    /**\n     * Removes a middleware from the InstantSearch lifecycle.\n     */\n  }, {\n    key: \"unuse\",\n    value: function unuse() {\n      for (var _len2 = arguments.length, middlewareToUnuse = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n        middlewareToUnuse[_key2] = arguments[_key2];\n      }\n      this.middleware.filter(function (m) {\n        return middlewareToUnuse.includes(m.creator);\n      }).forEach(function (m) {\n        return m.instance.unsubscribe();\n      });\n      this.middleware = this.middleware.filter(function (m) {\n        return !middlewareToUnuse.includes(m.creator);\n      });\n      return this;\n    }\n\n    // @major we shipped with EXPERIMENTAL_use, but have changed that to just `use` now\n  }, {\n    key: \"EXPERIMENTAL_use\",\n    value: function EXPERIMENTAL_use() {\n      process.env.NODE_ENV === 'development' ? warning(false, 'The middleware API is now considered stable, so we recommend replacing `EXPERIMENTAL_use` with `use` before upgrading to the next major version.') : void 0;\n      return this.use.apply(this, arguments);\n    }\n\n    /**\n     * Adds a widget to the search instance.\n     * A widget can be added either before or after InstantSearch has started.\n     * @param widget The widget to add to InstantSearch.\n     *\n     * @deprecated This method will still be supported in 4.x releases, but not further. It is replaced by `addWidgets([widget])`.\n     */\n  }, {\n    key: \"addWidget\",\n    value: function addWidget(widget) {\n      process.env.NODE_ENV === 'development' ? warning(false, 'addWidget will still be supported in 4.x releases, but not further. It is replaced by `addWidgets([widget])`') : void 0;\n      return this.addWidgets([widget]);\n    }\n\n    /**\n     * Adds multiple widgets to the search instance.\n     * Widgets can be added either before or after InstantSearch has started.\n     * @param widgets The array of widgets to add to InstantSearch.\n     */\n  }, {\n    key: \"addWidgets\",\n    value: function addWidgets(widgets) {\n      if (!Array.isArray(widgets)) {\n        throw new Error(withUsage('The `addWidgets` method expects an array of widgets. Please use `addWidget`.'));\n      }\n      if (widgets.some(function (widget) {\n        return typeof widget.init !== 'function' && typeof widget.render !== 'function';\n      })) {\n        throw new Error(withUsage('The widget definition expects a `render` and/or an `init` method.'));\n      }\n      this.mainIndex.addWidgets(widgets);\n      return this;\n    }\n\n    /**\n     * Removes a widget from the search instance.\n     * @deprecated This method will still be supported in 4.x releases, but not further. It is replaced by `removeWidgets([widget])`\n     * @param widget The widget instance to remove from InstantSearch.\n     *\n     * The widget must implement a `dispose()` method to clear its state.\n     */\n  }, {\n    key: \"removeWidget\",\n    value: function removeWidget(widget) {\n      process.env.NODE_ENV === 'development' ? warning(false, 'removeWidget will still be supported in 4.x releases, but not further. It is replaced by `removeWidgets([widget])`') : void 0;\n      return this.removeWidgets([widget]);\n    }\n\n    /**\n     * Removes multiple widgets from the search instance.\n     * @param widgets Array of widgets instances to remove from InstantSearch.\n     *\n     * The widgets must implement a `dispose()` method to clear their states.\n     */\n  }, {\n    key: \"removeWidgets\",\n    value: function removeWidgets(widgets) {\n      if (!Array.isArray(widgets)) {\n        throw new Error(withUsage('The `removeWidgets` method expects an array of widgets. Please use `removeWidget`.'));\n      }\n      if (widgets.some(function (widget) {\n        return typeof widget.dispose !== 'function';\n      })) {\n        throw new Error(withUsage('The widget definition expects a `dispose` method.'));\n      }\n      this.mainIndex.removeWidgets(widgets);\n      return this;\n    }\n\n    /**\n     * Ends the initialization of InstantSearch.js and triggers the\n     * first search. This method should be called after all widgets have been added\n     * to the instance of InstantSearch.js. InstantSearch.js also supports adding and removing\n     * widgets after the start as an **EXPERIMENTAL** feature.\n     */\n  }, {\n    key: \"start\",\n    value: function start() {\n      var _this3 = this;\n      if (this.started) {\n        throw new Error(withUsage('The `start` method has already been called once.'));\n      }\n\n      // This Helper is used for the queries, we don't care about its state. The\n      // states are managed at the `index` level. We use this Helper to create\n      // DerivedHelper scoped into the `index` widgets.\n      // In Vue InstantSearch' hydrate, a main helper gets set before start, so\n      // we need to respect this helper as a way to keep all listeners correct.\n      var mainHelper = this.mainHelper || algoliasearchHelper(this.client, this.indexName);\n      mainHelper.search = function () {\n        _this3.status = 'loading';\n        _this3.scheduleRender(false);\n        process.env.NODE_ENV === 'development' ? warning(Boolean(_this3.indexName) || _this3.mainIndex.getWidgets().some(isIndexWidget), 'No indexName provided, nor an explicit index widget in the widgets tree. This is required to be able to display results.') : void 0;\n\n        // This solution allows us to keep the exact same API for the users but\n        // under the hood, we have a different implementation. It should be\n        // completely transparent for the rest of the codebase. Only this module\n        // is impacted.\n        return mainHelper.searchOnlyWithDerivedHelpers();\n      };\n      if (this._searchFunction) {\n        // this client isn't used to actually search, but required for the helper\n        // to not throw errors\n        var fakeClient = {\n          search: function search() {\n            return new Promise(noop);\n          }\n        };\n        this._mainHelperSearch = mainHelper.search.bind(mainHelper);\n        mainHelper.search = function () {\n          var mainIndexHelper = _this3.mainIndex.getHelper();\n          var searchFunctionHelper = algoliasearchHelper(fakeClient, mainIndexHelper.state.index, mainIndexHelper.state);\n          searchFunctionHelper.once('search', function (_ref2) {\n            var state = _ref2.state;\n            mainIndexHelper.overrideStateWithoutTriggeringChangeEvent(state);\n            _this3._mainHelperSearch();\n          });\n          // Forward state changes from `searchFunctionHelper` to `mainIndexHelper`\n          searchFunctionHelper.on('change', function (_ref3) {\n            var state = _ref3.state;\n            mainIndexHelper.setState(state);\n          });\n          _this3._searchFunction(searchFunctionHelper);\n          return mainHelper;\n        };\n      }\n\n      // Only the \"main\" Helper emits the `error` event vs the one for `search`\n      // and `results` that are also emitted on the derived one.\n      mainHelper.on('error', function (_ref4) {\n        var error = _ref4.error;\n        if (!(error instanceof Error)) {\n          // typescript lies here, error is in some cases { name: string, message: string }\n          var err = error;\n          error = Object.keys(err).reduce(function (acc, key) {\n            acc[key] = err[key];\n            return acc;\n          }, new Error(err.message));\n        }\n        // If an error is emitted, it is re-thrown by events. In previous versions\n        // we emitted {error}, which is thrown as:\n        // \"Uncaught, unspecified \\\"error\\\" event. ([object Object])\"\n        // To avoid breaking changes, we make the error available in both\n        // `error` and `error.error`\n        // @MAJOR emit only error\n        error.error = error;\n        _this3.error = error;\n        _this3.status = 'error';\n        _this3.scheduleRender(false);\n\n        // This needs to execute last because it throws the error.\n        _this3.emit('error', error);\n      });\n      this.mainHelper = mainHelper;\n      this.middleware.forEach(function (_ref5) {\n        var instance = _ref5.instance;\n        instance.subscribe();\n      });\n      this.mainIndex.init({\n        instantSearchInstance: this,\n        parent: null,\n        uiState: this._initialUiState\n      });\n      if (this._initialResults) {\n        var originalScheduleSearch = this.scheduleSearch;\n        // We don't schedule a first search when initial results are provided\n        // because we already have the results to render. This skips the initial\n        // network request on the browser on `start`.\n        this.scheduleSearch = defer(noop);\n        // We also skip the initial network request when widgets are dynamically\n        // added in the first tick (that's the case in all the framework-based flavors).\n        // When we add a widget to `index`, it calls `scheduleSearch`. We can rely\n        // on our `defer` util to restore the original `scheduleSearch` value once\n        // widgets are added to hook back to the regular lifecycle.\n        defer(function () {\n          _this3.scheduleSearch = originalScheduleSearch;\n        })();\n      }\n      // We only schedule a search when widgets have been added before `start()`\n      // because there are listeners that can use these results.\n      // This is especially useful in framework-based flavors that wait for\n      // dynamically-added widgets to trigger a network request. It avoids\n      // having to batch this initial network request with the one coming from\n      // `addWidgets()`.\n      // Later, we could also skip `index()` widgets and widgets that don't read\n      // the results, but this is an optimization that has a very low impact for now.\n      else if (this.mainIndex.getWidgets().length > 0) {\n        this.scheduleSearch();\n      }\n\n      // Keep the previous reference for legacy purpose, some pattern use\n      // the direct Helper access `search.helper` (e.g multi-index).\n      this.helper = this.mainIndex.getHelper();\n\n      // track we started the search if we add more widgets,\n      // to init them directly after add\n      this.started = true;\n      this.middleware.forEach(function (_ref6) {\n        var instance = _ref6.instance;\n        instance.started();\n      });\n    }\n\n    /**\n     * Removes all widgets without triggering a search afterwards. This is an **EXPERIMENTAL** feature,\n     * if you find an issue with it, please\n     * [open an issue](https://github.com/algolia/instantsearch/issues/new?title=Problem%20with%20dispose).\n     * @return {undefined} This method does not return anything\n     */\n  }, {\n    key: \"dispose\",\n    value: function dispose() {\n      var _this$mainHelper2;\n      this.scheduleSearch.cancel();\n      this.scheduleRender.cancel();\n      clearTimeout(this._searchStalledTimer);\n      this.removeWidgets(this.mainIndex.getWidgets());\n      this.mainIndex.dispose();\n\n      // You can not start an instance two times, therefore a disposed instance\n      // needs to set started as false otherwise this can not be restarted at a\n      // later point.\n      this.started = false;\n\n      // The helper needs to be reset to perform the next search from a fresh state.\n      // If not reset, it would use the state stored before calling `dispose()`.\n      this.removeAllListeners();\n      (_this$mainHelper2 = this.mainHelper) === null || _this$mainHelper2 === void 0 ? void 0 : _this$mainHelper2.removeAllListeners();\n      this.mainHelper = null;\n      this.helper = null;\n      this.middleware.forEach(function (_ref7) {\n        var instance = _ref7.instance;\n        instance.unsubscribe();\n      });\n    }\n  }, {\n    key: \"scheduleStalledRender\",\n    value: function scheduleStalledRender() {\n      var _this4 = this;\n      if (!this._searchStalledTimer) {\n        this._searchStalledTimer = setTimeout(function () {\n          _this4.status = 'stalled';\n          _this4.scheduleRender();\n        }, this._stalledSearchDelay);\n      }\n    }\n\n    /**\n     * Set the UI state and trigger a search.\n     * @param uiState The next UI state or a function computing it from the current state\n     * @param callOnStateChange private parameter used to know if the method is called from a state change\n     */\n  }, {\n    key: \"setUiState\",\n    value: function setUiState(uiState) {\n      var _this5 = this;\n      var callOnStateChange = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n      if (!this.mainHelper) {\n        throw new Error(withUsage('The `start` method needs to be called before `setUiState`.'));\n      }\n\n      // We refresh the index UI state to update the local UI state that the\n      // main index passes to the function form of `setUiState`.\n      this.mainIndex.refreshUiState();\n      var nextUiState = typeof uiState === 'function' ? uiState(this.mainIndex.getWidgetUiState({})) : uiState;\n      if (this.onStateChange && callOnStateChange) {\n        this.onStateChange({\n          uiState: nextUiState,\n          setUiState: function setUiState(finalUiState) {\n            setIndexHelperState(typeof finalUiState === 'function' ? finalUiState(nextUiState) : finalUiState, _this5.mainIndex);\n            _this5.scheduleSearch();\n            _this5.onInternalStateChange();\n          }\n        });\n      } else {\n        setIndexHelperState(nextUiState, this.mainIndex);\n        this.scheduleSearch();\n        this.onInternalStateChange();\n      }\n    }\n  }, {\n    key: \"getUiState\",\n    value: function getUiState() {\n      if (this.started) {\n        // We refresh the index UI state to make sure changes from `refine` are taken in account\n        this.mainIndex.refreshUiState();\n      }\n      return this.mainIndex.getWidgetUiState({});\n    }\n  }, {\n    key: \"createURL\",\n    value: function createURL() {\n      var nextState = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n      if (!this.started) {\n        throw new Error(withUsage('The `start` method needs to be called before `createURL`.'));\n      }\n      return this._createURL(nextState);\n    }\n  }, {\n    key: \"refresh\",\n    value: function refresh() {\n      if (!this.mainHelper) {\n        throw new Error(withUsage('The `start` method needs to be called before `refresh`.'));\n      }\n      this.mainHelper.clearCache().search();\n    }\n  }]);\n  return InstantSearch;\n}(EventEmitter);\nexport default InstantSearch;","export default '4.57.0';","// typed as any, since it accepts the _real_ js clients, not the interface we otherwise expect\nexport function getAppIdAndApiKey(searchClient) {\n  if (searchClient.transporter) {\n    // searchClient v4\n    var _searchClient$transpo = searchClient.transporter,\n      headers = _searchClient$transpo.headers,\n      queryParameters = _searchClient$transpo.queryParameters;\n    var APP_ID = 'x-algolia-application-id';\n    var API_KEY = 'x-algolia-api-key';\n    var appId = headers[APP_ID] || queryParameters[APP_ID];\n    var apiKey = headers[API_KEY] || queryParameters[API_KEY];\n    return [appId, apiKey];\n  } else {\n    // searchClient v3\n    return [searchClient.applicationID, searchClient.apiKey];\n  }\n}","// We aren't using the native `Array.prototype.find` because the refactor away from Lodash is not\n// published as a major version.\n// Relying on the `find` polyfill on user-land, which before was only required for niche use-cases,\n// was decided as too risky.\n// @MAJOR Replace with the native `Array.prototype.find` method\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find\nexport function find(items, predicate) {\n  var value;\n  for (var i = 0; i < items.length; i++) {\n    value = items[i];\n    // inlined for performance: if (Call(predicate, thisArg, [value, i, list])) {\n    if (predicate(value, i, items)) {\n      return value;\n    }\n  }\n  return undefined;\n}","export default '7.1.0';","import InstantSearch from \"instantsearch.js/es/lib/InstantSearch.js\";\nimport { useCallback, useRef, version as ReactVersion } from 'react';\nimport { useSyncExternalStore } from \"use-sync-external-store/shim/index.js\";\nimport version from \"../version.js\";\nimport { useForceUpdate } from \"./useForceUpdate.js\";\nimport { useInstantSearchServerContext } from \"./useInstantSearchServerContext.js\";\nimport { useInstantSearchSSRContext } from \"./useInstantSearchSSRContext.js\";\nimport { useRSCContext } from \"./useRSCContext.js\";\nimport { warn } from \"./warn.js\";\nvar defaultUserAgents = [\"react (\".concat(ReactVersion, \")\"), \"react-instantsearch (\".concat(version, \")\"), \"react-instantsearch-core (\".concat(version, \")\")];\nvar serverUserAgent = \"react-instantsearch-server (\".concat(version, \")\");\nvar nextUserAgent = function nextUserAgent(nextVersion) {\n  return nextVersion ? \"next.js (\".concat(nextVersion, \")\") : null;\n};\nexport function useInstantSearchApi(props) {\n  var forceUpdate = useForceUpdate();\n  var serverContext = useInstantSearchServerContext();\n  var serverState = useInstantSearchSSRContext();\n  var waitingForResultsRef = useRSCContext();\n  var initialResults = serverState === null || serverState === void 0 ? void 0 : serverState.initialResults;\n  var prevPropsRef = useRef(props);\n  var shouldRenderAtOnce = serverContext || initialResults || waitingForResultsRef;\n  var searchRef = useRef(null);\n  // As we need to render on mount with SSR, using the local ref above in `StrictMode` will\n  // create and start two instances of InstantSearch. To avoid this, we instead discard it and use\n  // an upward ref from `InstantSearchSSRContext` as it has already been mounted a second time at this point.\n  if (serverState) {\n    searchRef = serverState.ssrSearchRef;\n  }\n  if (searchRef.current === null) {\n    // We don't use the `instantsearch()` function because it comes with other\n    // top-level APIs that we don't need.\n    // See https://github.com/algolia/instantsearch/blob/5b529f43d8acc680f85837eaaa41f7fd03a3f833/src/index.es.ts#L63-L86\n    var search = new InstantSearch(props);\n    search._schedule = function _schedule(cb) {\n      search._schedule.queue.push(cb);\n      clearTimeout(search._schedule.timer);\n      search._schedule.timer = setTimeout(function () {\n        search._schedule.queue.forEach(function (callback) {\n          callback();\n        });\n        search._schedule.queue = [];\n      }, 0);\n    };\n    search._schedule.queue = [];\n    if (shouldRenderAtOnce) {\n      // InstantSearch.js has a private Initial Results API that lets us inject\n      // results on the search instance.\n      // On the server, we default the initial results to an empty object so that\n      // InstantSearch.js doesn't schedule a search that isn't used, leading to\n      // an additional network request. (This is equivalent to monkey-patching\n      // `scheduleSearch` to a noop.)\n      search._initialResults = initialResults || {};\n    }\n    addAlgoliaAgents(props.searchClient, [].concat(defaultUserAgents, [serverContext && serverUserAgent, nextUserAgent(getNextVersion())]));\n\n    // On the server, we start the search early to compute the search parameters.\n    // On SSR, we start the search early to directly catch up with the lifecycle\n    // and render.\n    if (shouldRenderAtOnce) {\n      search.start();\n    }\n    if (serverContext) {\n      // We notify `getServerState()` of the InstantSearch internals to retrieve\n      // the server state and pass it to the render on SSR.\n      serverContext.notifyServer({\n        search: search\n      });\n    }\n    warnNextRouter(props.routing);\n    warnNextAppDir(Boolean(waitingForResultsRef));\n    searchRef.current = search;\n  }\n  {\n    var _search = searchRef.current;\n    var prevProps = prevPropsRef.current;\n    if (prevProps.indexName !== props.indexName) {\n      _search.helper.setIndex(props.indexName || '').search();\n      prevPropsRef.current = props;\n    }\n    if (prevProps.searchClient !== props.searchClient) {\n      process.env.NODE_ENV === 'development' ? warn(false, 'The `searchClient` prop of `<InstantSearch>` changed between renders, which may cause more search requests than necessary. If this is an unwanted behavior, please provide a stable reference: https://www.algolia.com/doc/api-reference/widgets/instantsearch/react/#widget-param-searchclient') : void 0;\n      addAlgoliaAgents(props.searchClient, [].concat(defaultUserAgents, [serverContext && serverUserAgent]));\n      _search.mainHelper.setClient(props.searchClient).search();\n      prevPropsRef.current = props;\n    }\n    if (prevProps.onStateChange !== props.onStateChange) {\n      _search.onStateChange = props.onStateChange;\n      prevPropsRef.current = props;\n    }\n    if (prevProps.searchFunction !== props.searchFunction) {\n      // Updating the `searchFunction` to `undefined` is not supported by\n      // InstantSearch.js, so it will throw an error.\n      // This is a fair behavior until we add an update API in InstantSearch.js.\n      _search._searchFunction = props.searchFunction;\n      prevPropsRef.current = props;\n    }\n    if (prevProps.stalledSearchDelay !== props.stalledSearchDelay) {\n      var _props$stalledSearchD;\n      // The default `stalledSearchDelay` in InstantSearch.js is 200ms.\n      // We need to reset it when it's undefined to get back to the original value.\n      _search._stalledSearchDelay = (_props$stalledSearchD = props.stalledSearchDelay) !== null && _props$stalledSearchD !== void 0 ? _props$stalledSearchD : 200;\n      prevPropsRef.current = props;\n    }\n\n    // Updating the `routing` prop is not supported because InstantSearch.js\n    // doesn't let us change it. This might not be a problem though, because `routing`\n    // shouldn't need to be dynamic.\n    // If we find scenarios where `routing` needs to change, we can always expose\n    // it privately on the InstantSearch instance. Another way would be to\n    // manually inject the routing middleware in this library, and not rely\n    // on the provided `routing` prop.\n  }\n\n  var cleanupTimerRef = useRef(null);\n  var store = useSyncExternalStore(useCallback(function () {\n    var search = searchRef.current;\n\n    // Scenario 1: the component mounts.\n    if (cleanupTimerRef.current === null) {\n      // On SSR, the instance is already started so we don't start it again.\n      if (!search.started) {\n        search.start();\n        forceUpdate();\n      }\n    }\n    // Scenario 2: the component updates.\n    else {\n      // We cancel the previous cleanup function because we don't want to\n      // dispose the search during an update.\n      clearTimeout(cleanupTimerRef.current);\n      search._preventWidgetCleanup = false;\n    }\n    return function () {\n      function cleanup() {\n        search.dispose();\n      }\n      clearTimeout(search._schedule.timer);\n      // We clean up only when the component that uses this subscription unmounts,\n      // but not when it updates, because it would dispose the instance, which\n      // would remove all the widgets and break routing.\n      // Executing the cleanup function in a `setTimeout()` lets us cancel it\n      // in the next effect.\n      // (There might be better ways to do this.)\n      cleanupTimerRef.current = setTimeout(cleanup);\n\n      // We need to prevent the `useWidget` cleanup function so that widgets\n      // are not removed before the instance is disposed, triggering\n      // an unwanted search request.\n      search._preventWidgetCleanup = true;\n    };\n  }, [forceUpdate]), function () {\n    return searchRef.current;\n  }, function () {\n    return searchRef.current;\n  });\n  return store;\n}\nfunction addAlgoliaAgents(searchClient, userAgents) {\n  if (typeof searchClient.addAlgoliaAgent !== 'function') {\n    return;\n  }\n  userAgents.filter(Boolean).forEach(function (userAgent) {\n    searchClient.addAlgoliaAgent(userAgent);\n  });\n}\nfunction warnNextRouter(routing) {\n  if (process.env.NODE_ENV === 'development') {\n    var _routing$router;\n    if (!routing || typeof window === 'undefined' || !('__NEXT_DATA__' in window)) {\n      return;\n    }\n    var isUsingNextRouter =\n    // @ts-expect-error: _isNextRouter is only set on the Next.js router\n    routing !== true && (routing === null || routing === void 0 ? void 0 : (_routing$router = routing.router) === null || _routing$router === void 0 ? void 0 : _routing$router._isNextRouter);\n    process.env.NODE_ENV === 'development' ? warn(isUsingNextRouter, \"\\nYou are using Next.js with InstantSearch without the \\\"react-instantsearch-router-nextjs\\\" package.\\nThis package is recommended to make the routing work correctly with Next.js.\\nPlease check its usage instructions: https://github.com/algolia/instantsearch/tree/master/packages/react-instantsearch-router-nextjs\\n\\nYou can ignore this warning if you are using a custom router that suits your needs, it won't be outputted in production builds.\") : void 0;\n  }\n}\nfunction warnNextAppDir(isRscContextDefined) {\n  var _next;\n  if (!(process.env.NODE_ENV === 'development') || typeof window === 'undefined' || isRscContextDefined) {\n    return;\n  }\n  process.env.NODE_ENV === 'development' ? warn(Boolean((_next = window.next) === null || _next === void 0 ? void 0 : _next.appDir) === false, \"\\nWe've detected you are using Next.js with the App Router.\\nWe released an **experimental** package called \\\"react-instantsearch-nextjs\\\" that makes SSR work with the App Router.\\nPlease check its usage instructions: https://www.algolia.com/doc/guides/building-search-ui/going-further/server-side-rendering/react/#with-nextjs\\n\\nThis warning will not be outputted in production builds.\") : void 0;\n}\n\n/**\n * Gets the version of Next.js if it is available in the `window` object,\n * otherwise it returns the NEXT_RUNTIME environment variable (in SSR),\n * which is either `nodejs` or `edge`.\n */\nfunction getNextVersion() {\n  var _next2, _process$env;\n  return typeof window !== 'undefined' && ((_next2 = window.next) === null || _next2 === void 0 ? void 0 : _next2.version) || (typeof process !== 'undefined' ? (_process$env = process.env) === null || _process$env === void 0 ? void 0 : _process$env.NEXT_RUNTIME : undefined);\n}","var _excluded = [\"children\"];\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\nimport React from 'react';\nimport { IndexContext } from \"../lib/IndexContext.js\";\nimport { InstantSearchContext } from \"../lib/InstantSearchContext.js\";\nimport { useInstantSearchApi } from \"../lib/useInstantSearchApi.js\";\nexport function InstantSearch(_ref) {\n  var children = _ref.children,\n    props = _objectWithoutProperties(_ref, _excluded);\n  var search = useInstantSearchApi(props);\n  if (!search.started) {\n    return null;\n  }\n  return /*#__PURE__*/React.createElement(InstantSearchContext.Provider, {\n    value: search\n  }, /*#__PURE__*/React.createElement(IndexContext.Provider, {\n    value: search.mainIndex\n  }, children));\n}","function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }\nfunction _iterableToArrayLimit(arr, i) { var _i = null == arr ? null : \"undefined\" != typeof Symbol && arr[Symbol.iterator] || arr[\"@@iterator\"]; if (null != _i) { var _s, _e, _x, _r, _arr = [], _n = !0, _d = !1; try { if (_x = (_i = _i.call(arr)).next, 0 === i) { if (Object(_i) !== _i) return; _n = !1; } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0); } catch (err) { _d = !0, _e = err; } finally { try { if (!_n && null != _i.return && (_r = _i.return(), Object(_r) !== _r)) return; } finally { if (_d) throw _e; } } return _arr; } }\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nimport { serializePayload } from \"./serializer.js\";\nfunction chunk(arr) {\n  var chunkSize = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 20;\n  var chunks = [];\n  for (var i = 0; i < Math.ceil(arr.length / chunkSize); i++) {\n    chunks.push(arr.slice(i * chunkSize, (i + 1) * chunkSize));\n  }\n  return chunks;\n}\nexport function _buildEventPayloadsForHits(_ref) {\n  var index = _ref.index,\n    widgetType = _ref.widgetType,\n    methodName = _ref.methodName,\n    args = _ref.args,\n    instantSearchInstance = _ref.instantSearchInstance;\n  // when there's only one argument, that means it's custom\n  if (args.length === 1 && _typeof(args[0]) === 'object') {\n    return [args[0]];\n  }\n  var _args$0$split = args[0].split(':'),\n    _args$0$split2 = _slicedToArray(_args$0$split, 2),\n    eventType = _args$0$split2[0],\n    eventModifier = _args$0$split2[1];\n  var hits = args[1];\n  var eventName = args[2];\n  if (!hits) {\n    if (process.env.NODE_ENV === 'development') {\n      throw new Error(\"You need to pass hit or hits as the second argument like:\\n  \".concat(methodName, \"(eventType, hit);\\n  \"));\n    } else {\n      return [];\n    }\n  }\n  if ((eventType === 'click' || eventType === 'conversion') && !eventName) {\n    if (process.env.NODE_ENV === 'development') {\n      throw new Error(\"You need to pass eventName as the third argument for 'click' or 'conversion' events like:\\n  \".concat(methodName, \"('click', hit, 'Product Purchased');\\n\\n  To learn more about event naming: https://www.algolia.com/doc/guides/getting-insights-and-analytics/search-analytics/click-through-and-conversions/in-depth/clicks-conversions-best-practices/\\n  \"));\n    } else {\n      return [];\n    }\n  }\n  var hitsArray = Array.isArray(hits) ? hits : [hits];\n  if (hitsArray.length === 0) {\n    return [];\n  }\n  var queryID = hitsArray[0].__queryID;\n  var hitsChunks = chunk(hitsArray);\n  var objectIDsByChunk = hitsChunks.map(function (batch) {\n    return batch.map(function (hit) {\n      return hit.objectID;\n    });\n  });\n  var positionsByChunk = hitsChunks.map(function (batch) {\n    return batch.map(function (hit) {\n      return hit.__position;\n    });\n  });\n  if (eventType === 'view') {\n    if (instantSearchInstance.status !== 'idle') {\n      return [];\n    }\n    return hitsChunks.map(function (batch, i) {\n      return {\n        insightsMethod: 'viewedObjectIDs',\n        widgetType: widgetType,\n        eventType: eventType,\n        payload: {\n          eventName: eventName || 'Hits Viewed',\n          index: index,\n          objectIDs: objectIDsByChunk[i]\n        },\n        hits: batch,\n        eventModifier: eventModifier\n      };\n    });\n  } else if (eventType === 'click') {\n    return hitsChunks.map(function (batch, i) {\n      return {\n        insightsMethod: 'clickedObjectIDsAfterSearch',\n        widgetType: widgetType,\n        eventType: eventType,\n        payload: {\n          eventName: eventName || 'Hit Clicked',\n          index: index,\n          queryID: queryID,\n          objectIDs: objectIDsByChunk[i],\n          positions: positionsByChunk[i]\n        },\n        hits: batch,\n        eventModifier: eventModifier\n      };\n    });\n  } else if (eventType === 'conversion') {\n    return hitsChunks.map(function (batch, i) {\n      return {\n        insightsMethod: 'convertedObjectIDsAfterSearch',\n        widgetType: widgetType,\n        eventType: eventType,\n        payload: {\n          eventName: eventName || 'Hit Converted',\n          index: index,\n          queryID: queryID,\n          objectIDs: objectIDsByChunk[i]\n        },\n        hits: batch,\n        eventModifier: eventModifier\n      };\n    });\n  } else if (process.env.NODE_ENV === 'development') {\n    throw new Error(\"eventType(\\\"\".concat(eventType, \"\\\") is not supported.\\n    If you want to send a custom payload, you can pass one object: \").concat(methodName, \"(customPayload);\\n    \"));\n  } else {\n    return [];\n  }\n}\nexport function createSendEventForHits(_ref2) {\n  var instantSearchInstance = _ref2.instantSearchInstance,\n    index = _ref2.index,\n    widgetType = _ref2.widgetType;\n  var sentEvents = {};\n  var timer = undefined;\n  var sendEventForHits = function sendEventForHits() {\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n    var payloads = _buildEventPayloadsForHits({\n      widgetType: widgetType,\n      index: index,\n      methodName: 'sendEvent',\n      args: args,\n      instantSearchInstance: instantSearchInstance\n    });\n    payloads.forEach(function (payload) {\n      if (payload.eventType === 'click' && payload.eventModifier === 'internal' && sentEvents[payload.eventType]) {\n        return;\n      }\n      sentEvents[payload.eventType] = true;\n      instantSearchInstance.sendEventToInsights(payload);\n    });\n    clearTimeout(timer);\n    timer = setTimeout(function () {\n      sentEvents = {};\n    }, 0);\n  };\n  return sendEventForHits;\n}\nexport function createBindEventForHits(_ref3) {\n  var index = _ref3.index,\n    widgetType = _ref3.widgetType,\n    instantSearchInstance = _ref3.instantSearchInstance;\n  var bindEventForHits = function bindEventForHits() {\n    for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n      args[_key2] = arguments[_key2];\n    }\n    var payloads = _buildEventPayloadsForHits({\n      widgetType: widgetType,\n      index: index,\n      methodName: 'bindEvent',\n      args: args,\n      instantSearchInstance: instantSearchInstance\n    });\n    return payloads.length ? \"data-insights-event=\".concat(serializePayload(payloads)) : '';\n  };\n  return bindEventForHits;\n}","function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\nexport function addAbsolutePosition(hits, page, hitsPerPage) {\n  return hits.map(function (hit, idx) {\n    return _objectSpread(_objectSpread({}, hit), {}, {\n      __position: hitsPerPage * page + idx + 1\n    });\n  });\n}","function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\nexport function addQueryID(hits, queryID) {\n  if (!queryID) {\n    return hits;\n  }\n  return hits.map(function (hit) {\n    return _objectSpread(_objectSpread({}, hit), {}, {\n      __queryID: queryID\n    });\n  });\n}","function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\nimport { escapeHits, TAG_PLACEHOLDER, checkRendering, createDocumentationMessageGenerator, addAbsolutePosition, addQueryID, createSendEventForHits, createBindEventForHits, noop } from \"../../lib/utils/index.js\";\nvar withUsage = createDocumentationMessageGenerator({\n  name: 'hits',\n  connector: true\n});\nvar connectHits = function connectHits(renderFn) {\n  var unmountFn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : noop;\n  checkRendering(renderFn, withUsage());\n  return function (widgetParams) {\n    var _ref = widgetParams || {},\n      _ref$escapeHTML = _ref.escapeHTML,\n      escapeHTML = _ref$escapeHTML === void 0 ? true : _ref$escapeHTML,\n      _ref$transformItems = _ref.transformItems,\n      transformItems = _ref$transformItems === void 0 ? function (items) {\n        return items;\n      } : _ref$transformItems;\n    var sendEvent;\n    var bindEvent;\n    return {\n      $$type: 'ais.hits',\n      init: function init(initOptions) {\n        renderFn(_objectSpread(_objectSpread({}, this.getWidgetRenderState(initOptions)), {}, {\n          instantSearchInstance: initOptions.instantSearchInstance\n        }), true);\n      },\n      render: function render(renderOptions) {\n        var renderState = this.getWidgetRenderState(renderOptions);\n        renderFn(_objectSpread(_objectSpread({}, renderState), {}, {\n          instantSearchInstance: renderOptions.instantSearchInstance\n        }), false);\n        renderState.sendEvent('view:internal', renderState.hits);\n      },\n      getRenderState: function getRenderState(renderState, renderOptions) {\n        return _objectSpread(_objectSpread({}, renderState), {}, {\n          hits: this.getWidgetRenderState(renderOptions)\n        });\n      },\n      getWidgetRenderState: function getWidgetRenderState(_ref2) {\n        var results = _ref2.results,\n          helper = _ref2.helper,\n          instantSearchInstance = _ref2.instantSearchInstance;\n        if (!sendEvent) {\n          sendEvent = createSendEventForHits({\n            instantSearchInstance: instantSearchInstance,\n            index: helper.getIndex(),\n            widgetType: this.$$type\n          });\n        }\n        if (!bindEvent) {\n          bindEvent = createBindEventForHits({\n            index: helper.getIndex(),\n            widgetType: this.$$type,\n            instantSearchInstance: instantSearchInstance\n          });\n        }\n        if (!results) {\n          return {\n            hits: [],\n            results: undefined,\n            sendEvent: sendEvent,\n            bindEvent: bindEvent,\n            widgetParams: widgetParams\n          };\n        }\n        if (escapeHTML && results.hits.length > 0) {\n          results.hits = escapeHits(results.hits);\n        }\n        var hitsWithAbsolutePosition = addAbsolutePosition(results.hits, results.page, results.hitsPerPage);\n        var hitsWithAbsolutePositionAndQueryID = addQueryID(hitsWithAbsolutePosition, results.queryID);\n        var transformedHits = transformItems(hitsWithAbsolutePositionAndQueryID, {\n          results: results\n        });\n        return {\n          hits: transformedHits,\n          results: results,\n          sendEvent: sendEvent,\n          bindEvent: bindEvent,\n          widgetParams: widgetParams\n        };\n      },\n      dispose: function dispose(_ref3) {\n        var state = _ref3.state;\n        unmountFn();\n        if (!escapeHTML) {\n          return state;\n        }\n        return state.setQueryParameters(Object.keys(TAG_PLACEHOLDER).reduce(function (acc, key) {\n          return _objectSpread(_objectSpread({}, acc), {}, _defineProperty({}, key, undefined));\n        }, {}));\n      },\n      getWidgetSearchParameters: function getWidgetSearchParameters(state) {\n        if (!escapeHTML) {\n          return state;\n        }\n        return state.setQueryParameters(TAG_PLACEHOLDER);\n      }\n    };\n  };\n};\nexport default connectHits;","import connectHits from \"instantsearch.js/es/connectors/hits/connectHits.js\";\nimport { useConnector } from \"../hooks/useConnector.js\";\nexport function useHits(props, additionalWidgetProperties) {\n  return useConnector(connectHits, props, additionalWidgetProperties);\n}","function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\nimport { checkRendering, createDocumentationMessageGenerator, noop } from \"../../lib/utils/index.js\";\nvar withUsage = createDocumentationMessageGenerator({\n  name: 'search-box',\n  connector: true\n});\n\n/**\n * @typedef {Object} CustomSearchBoxWidgetParams\n * @property {function(string, function(string))} [queryHook = undefined] A function that will be called every time\n * a new value for the query is set. The first parameter is the query and the second is a\n * function to actually trigger the search. The function takes the query as the parameter.\n *\n * This queryHook can be used to debounce the number of searches done from the searchBox.\n */\n\nvar defaultQueryHook = function defaultQueryHook(query, hook) {\n  return hook(query);\n};\n\n/**\n * **SearchBox** connector provides the logic to build a widget that will let the user search for a query.\n *\n * The connector provides to the rendering: `refine()` to set the query. The behaviour of this function\n * may be impacted by the `queryHook` widget parameter.\n */\nvar connectSearchBox = function connectSearchBox(renderFn) {\n  var unmountFn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : noop;\n  checkRendering(renderFn, withUsage());\n  return function (widgetParams) {\n    var _ref = widgetParams || {},\n      _ref$queryHook = _ref.queryHook,\n      queryHook = _ref$queryHook === void 0 ? defaultQueryHook : _ref$queryHook;\n    var _refine;\n    var _clear;\n    return {\n      $$type: 'ais.searchBox',\n      init: function init(initOptions) {\n        var instantSearchInstance = initOptions.instantSearchInstance;\n        renderFn(_objectSpread(_objectSpread({}, this.getWidgetRenderState(initOptions)), {}, {\n          instantSearchInstance: instantSearchInstance\n        }), true);\n      },\n      render: function render(renderOptions) {\n        var instantSearchInstance = renderOptions.instantSearchInstance;\n        renderFn(_objectSpread(_objectSpread({}, this.getWidgetRenderState(renderOptions)), {}, {\n          instantSearchInstance: instantSearchInstance\n        }), false);\n      },\n      dispose: function dispose(_ref2) {\n        var state = _ref2.state;\n        unmountFn();\n        return state.setQueryParameter('query', undefined);\n      },\n      getRenderState: function getRenderState(renderState, renderOptions) {\n        return _objectSpread(_objectSpread({}, renderState), {}, {\n          searchBox: this.getWidgetRenderState(renderOptions)\n        });\n      },\n      getWidgetRenderState: function getWidgetRenderState(_ref3) {\n        var helper = _ref3.helper,\n          searchMetadata = _ref3.searchMetadata,\n          state = _ref3.state;\n        if (!_refine) {\n          _refine = function _refine(query) {\n            queryHook(query, function (q) {\n              return helper.setQuery(q).search();\n            });\n          };\n          _clear = function _clear() {\n            helper.setQuery('').search();\n          };\n        }\n        return {\n          query: state.query || '',\n          refine: _refine,\n          clear: _clear,\n          widgetParams: widgetParams,\n          isSearchStalled: searchMetadata.isSearchStalled\n        };\n      },\n      getWidgetUiState: function getWidgetUiState(uiState, _ref4) {\n        var searchParameters = _ref4.searchParameters;\n        var query = searchParameters.query || '';\n        if (query === '' || uiState && uiState.query === query) {\n          return uiState;\n        }\n        return _objectSpread(_objectSpread({}, uiState), {}, {\n          query: query\n        });\n      },\n      getWidgetSearchParameters: function getWidgetSearchParameters(searchParameters, _ref5) {\n        var uiState = _ref5.uiState;\n        return searchParameters.setQueryParameter('query', uiState.query || '');\n      }\n    };\n  };\n};\nexport default connectSearchBox;","import connectSearchBox from \"instantsearch.js/es/connectors/search-box/connectSearchBox.js\";\nimport { useConnector } from \"../hooks/useConnector.js\";\nexport function useSearchBox(props, additionalWidgetProperties) {\n  return useConnector(connectSearchBox, props, additionalWidgetProperties);\n}","import algoliasearchHelper from 'algoliasearch-helper';\nexport function createSearchResults(state) {\n  var _state$query, _state$page, _state$hitsPerPage;\n  return new algoliasearchHelper.SearchResults(state, [{\n    query: (_state$query = state.query) !== null && _state$query !== void 0 ? _state$query : '',\n    page: (_state$page = state.page) !== null && _state$page !== void 0 ? _state$page : 0,\n    hitsPerPage: (_state$hitsPerPage = state.hitsPerPage) !== null && _state$hitsPerPage !== void 0 ? _state$hitsPerPage : 20,\n    hits: [],\n    nbHits: 0,\n    nbPages: 0,\n    params: '',\n    exhaustiveNbHits: true,\n    exhaustiveFacetsCount: true,\n    processingTimeMS: 0,\n    index: state.index\n  }], {\n    /** used by connectors to prevent persisting these results */\n    __isArtificial: true\n  });\n}","function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\nimport { createSearchResults } from \"./createSearchResults.js\";\nexport function getIndexSearchResults(indexWidget) {\n  var helper = indexWidget.getHelper();\n  var results =\n  // On SSR, we get the results injected on the Index.\n  indexWidget.getResults() ||\n  // On the browser, we create fallback results based on the helper state.\n  createSearchResults(helper.state);\n  var scopedResults = indexWidget.getScopedResults().map(function (scopedResult) {\n    var fallbackResults = scopedResult.indexId === indexWidget.getIndexId() ? results : createSearchResults(scopedResult.helper.state);\n    return _objectSpread(_objectSpread({}, scopedResult), {}, {\n      // We keep `results` from being `null`.\n      results: scopedResult.results || fallbackResults\n    });\n  });\n  return {\n    results: results,\n    scopedResults: scopedResults\n  };\n}","function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nvar _excluded = [\"instantSearchInstance\", \"widgetParams\"],\n  _excluded2 = [\"widgetParams\"];\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }\nfunction _iterableToArrayLimit(arr, i) { var _i = null == arr ? null : \"undefined\" != typeof Symbol && arr[Symbol.iterator] || arr[\"@@iterator\"]; if (null != _i) { var _s, _e, _x, _r, _arr = [], _n = !0, _d = !1; try { if (_x = (_i = _i.call(arr)).next, 0 === i) { if (Object(_i) !== _i) return; _n = !1; } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0); } catch (err) { _d = !0, _e = err; } finally { try { if (!_n && null != _i.return && (_r = _i.return(), Object(_r) !== _r)) return; } finally { if (_d) throw _e; } } return _arr; } }\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\nimport { useMemo, useRef, useState } from 'react';\nimport { dequal } from \"../lib/dequal.js\";\nimport { getIndexSearchResults } from \"../lib/getIndexSearchResults.js\";\nimport { useIndexContext } from \"../lib/useIndexContext.js\";\nimport { useInstantSearchContext } from \"../lib/useInstantSearchContext.js\";\nimport { useInstantSearchServerContext } from \"../lib/useInstantSearchServerContext.js\";\nimport { useStableValue } from \"../lib/useStableValue.js\";\nimport { useWidget } from \"../lib/useWidget.js\";\nexport function useConnector(connector) {\n  var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n  var additionalWidgetProperties = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n  var serverContext = useInstantSearchServerContext();\n  var search = useInstantSearchContext();\n  var parentIndex = useIndexContext();\n  var stableProps = useStableValue(props);\n  var stableAdditionalWidgetProperties = useStableValue(additionalWidgetProperties);\n  var shouldSetStateRef = useRef(true);\n  var previousRenderStateRef = useRef(null);\n  var previousStatusRef = useRef(search.status);\n  var widget = useMemo(function () {\n    var createWidget = connector(function (connectorState, isFirstRender) {\n      // We skip the `init` widget render because:\n      // - We rely on `getWidgetRenderState` to compute the initial state before\n      //   the InstantSearch.js lifecycle starts.\n      // - It prevents UI flashes when updating the widget props.\n      if (isFirstRender) {\n        shouldSetStateRef.current = true;\n        return;\n      }\n\n      // There are situations where InstantSearch.js may render widgets slightly\n      // after they're removed by React, and thus try to update the React state\n      // on unmounted components. React 16 and 17 consider them as memory leaks\n      // and display a warning.\n      // This happens in <DynamicWidgets> when `attributesToRender` contains a\n      // value without an attribute previously mounted. React will unmount the\n      // component controlled by that attribute, but InstantSearch.js will stay\n      // unaware of this change until the render pass finishes, and therefore\n      // notifies of a state change.\n      // This ref lets us track this situation and ignore these state updates.\n      if (shouldSetStateRef.current) {\n        var instantSearchInstance = connectorState.instantSearchInstance,\n          widgetParams = connectorState.widgetParams,\n          renderState = _objectWithoutProperties(connectorState, _excluded);\n\n        // We only update the state when a widget render state param changes,\n        // except for functions. We ignore function reference changes to avoid\n        // infinite loops. It's safe to omit them because they get updated\n        // every time another render param changes.\n        if (!dequal(renderState, previousRenderStateRef.current, function (a, b) {\n          return (a === null || a === void 0 ? void 0 : a.constructor) === Function && (b === null || b === void 0 ? void 0 : b.constructor) === Function;\n        }) || instantSearchInstance.status !== previousStatusRef.current) {\n          // eslint-disable-next-line @typescript-eslint/no-use-before-define\n          setState(renderState);\n          previousRenderStateRef.current = renderState;\n          previousStatusRef.current = instantSearchInstance.status;\n        }\n      }\n    }, function () {\n      // We'll ignore the next state update until we know for sure that\n      // InstantSearch.js re-inits the component.\n      shouldSetStateRef.current = false;\n    });\n    return _objectSpread(_objectSpread({}, createWidget(stableProps)), stableAdditionalWidgetProperties);\n  }, [connector, stableProps, stableAdditionalWidgetProperties]);\n  var _useState = useState(function () {\n      if (widget.getWidgetRenderState) {\n        var _widget$getWidgetSear;\n        // The helper exists because we've started InstantSearch.\n        var helper = parentIndex.getHelper();\n        var uiState = parentIndex.getWidgetUiState({})[parentIndex.getIndexId()];\n        helper.state = ((_widget$getWidgetSear = widget.getWidgetSearchParameters) === null || _widget$getWidgetSear === void 0 ? void 0 : _widget$getWidgetSear.call(widget, helper.state, {\n          uiState: uiState\n        })) || helper.state;\n        var _getIndexSearchResult = getIndexSearchResults(parentIndex),\n          results = _getIndexSearchResult.results,\n          scopedResults = _getIndexSearchResult.scopedResults;\n\n        // We get the widget render state by providing the same parameters as\n        // InstantSearch provides to the widget's `render` method.\n        // See https://github.com/algolia/instantsearch/blob/019cd18d0de6dd320284aa4890541b7fe2198c65/src/widgets/index/index.ts#L604-L617\n        var _widget$getWidgetRend = widget.getWidgetRenderState({\n            helper: helper,\n            parent: parentIndex,\n            instantSearchInstance: search,\n            results: results,\n            scopedResults: scopedResults,\n            state: helper.state,\n            renderState: search.renderState,\n            templatesConfig: search.templatesConfig,\n            createURL: parentIndex.createURL,\n            searchMetadata: {\n              isSearchStalled: search.status === 'stalled'\n            },\n            status: search.status,\n            error: search.error\n          }),\n          widgetParams = _widget$getWidgetRend.widgetParams,\n          renderState = _objectWithoutProperties(_widget$getWidgetRend, _excluded2);\n        return renderState;\n      }\n      return {};\n    }),\n    _useState2 = _slicedToArray(_useState, 2),\n    state = _useState2[0],\n    setState = _useState2[1];\n  useWidget({\n    widget: widget,\n    parentIndex: parentIndex,\n    props: stableProps,\n    shouldSsr: Boolean(serverContext)\n  });\n  return state;\n}","import { createContext } from 'react';\nexport var IndexContext = /*#__PURE__*/createContext(null);\nif (process.env.NODE_ENV === 'development') {\n  IndexContext.displayName = 'Index';\n}","import { createContext } from 'react';\nexport var InstantSearchContext = /*#__PURE__*/createContext(null);\nif (process.env.NODE_ENV === 'development') {\n  InstantSearchContext.displayName = 'InstantSearch';\n}","function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n/* eslint-disable complexity */\n\n/*\n * Code taken from dequal/lite v2.0.0\n * https://github.com/lukeed/dequal/blob/9aa73181ac7e081cd330cac67d313632ac04bb02/src/lite.js\n *\n * It adds a 3rd argument `compare(a, b)` that lets execute custom logic to\n * compare values.\n * We use it to skip comparing function references.\n */\n\n// eslint-disable-next-line @typescript-eslint/unbound-method\nvar has = Object.prototype.hasOwnProperty;\nexport function dequal(foo, bar, compare) {\n  // start of custom implementation\n  if (compare !== null && compare !== void 0 && compare(foo, bar)) {\n    return true;\n  }\n  // end of custom implementation\n\n  var ctor;\n  var len;\n  if (foo === bar) return true;\n  if (foo && bar && (ctor = foo.constructor) === bar.constructor) {\n    if (ctor === Date) return foo.getTime() === bar.getTime();\n    if (ctor === RegExp) return foo.toString() === bar.toString();\n    if (ctor === Array) {\n      if ((len = foo.length) === bar.length) {\n        while (len-- && dequal(foo[len], bar[len], compare));\n      }\n      return len === -1;\n    }\n    if (!ctor || _typeof(foo) === 'object') {\n      len = 0;\n      // eslint-disable-next-line guard-for-in, no-restricted-syntax\n      for (ctor in foo) {\n        if (has.call(foo, ctor) && ++len && !has.call(bar, ctor)) return false;\n        if (!(ctor in bar) || !dequal(foo[ctor], bar[ctor], compare)) return false;\n      }\n      return Object.keys(bar).length === len;\n    }\n  }\n\n  // eslint-disable-next-line no-self-compare\n  return foo !== foo && bar !== bar;\n}","/**\n * Throws an error if the condition is not met.\n *\n * The error is exhaustive in development, and becomes generic in production.\n *\n * This is used to make development a better experience to provide guidance as\n * to where the error comes from.\n */\nexport function invariant(condition, message) {\n  if (condition) {\n    return;\n  }\n  if (!(process.env.NODE_ENV === 'development')) {\n    throw new Error('Invariant failed');\n  }\n  if (process.env.NODE_ENV === 'development') {\n    throw new Error(\"[InstantSearch] \".concat(typeof message === 'function' ? message() : message));\n  }\n}","function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }\nfunction _iterableToArrayLimit(arr, i) { var _i = null == arr ? null : \"undefined\" != typeof Symbol && arr[Symbol.iterator] || arr[\"@@iterator\"]; if (null != _i) { var _s, _e, _x, _r, _arr = [], _n = !0, _d = !1; try { if (_x = (_i = _i.call(arr)).next, 0 === i) { if (Object(_i) !== _i) return; _n = !1; } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0); } catch (err) { _d = !0, _e = err; } finally { try { if (!_n && null != _i.return && (_r = _i.return(), Object(_r) !== _r)) return; } finally { if (_d) throw _e; } } return _arr; } }\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\nimport { useReducer } from 'react';\n\n/**\n * Forces a React update that triggers a rerender.\n * @link https://reactjs.org/docs/hooks-faq.html#is-there-something-like-forceupdate\n */\nexport function useForceUpdate() {\n  var _useReducer = useReducer(function (x) {\n      return x + 1;\n    }, 0),\n    _useReducer2 = _slicedToArray(_useReducer, 2),\n    forceUpdate = _useReducer2[1];\n  return forceUpdate;\n}","import { useContext } from 'react';\nimport { invariant } from \"./invariant.js\";\nimport { IndexContext } from \"./IndexContext.js\";\nexport function useIndexContext() {\n  var context = useContext(IndexContext);\n  invariant(context !== null, 'The <Index> component must be used within <InstantSearch>.');\n  return context;\n}","import { useContext } from 'react';\nimport { invariant } from \"./invariant.js\";\nimport { InstantSearchContext } from \"./InstantSearchContext.js\";\nexport function useInstantSearchContext() {\n  var search = useContext(InstantSearchContext);\n  invariant(search !== null, 'Hooks must be used inside the <InstantSearch> component.\\n\\n' + 'They are not compatible with the `react-instantsearch-core@6.x` and `react-instantsearch-dom` packages, so make sure to use the <InstantSearch> component from `react-instantsearch-core@7.x`.');\n  return search;\n}","import { createContext } from 'react';\nexport var InstantSearchSSRContext = /*#__PURE__*/createContext(null);\nif (process.env.NODE_ENV === 'development') {\n  InstantSearchSSRContext.displayName = 'InstantSearchSSR';\n}","import { useContext } from 'react';\nimport { InstantSearchSSRContext } from \"./InstantSearchSSRContext.js\";\nexport function useInstantSearchSSRContext() {\n  return useContext(InstantSearchSSRContext);\n}","import { createContext } from 'react';\nexport var InstantSearchServerContext = /*#__PURE__*/createContext(null);\nif (process.env.NODE_ENV === 'development') {\n  InstantSearchServerContext.displayName = 'InstantSearchServer';\n}","import { useContext } from 'react';\nimport { InstantSearchServerContext } from \"../components/InstantSearchServerContext.js\";\nexport function useInstantSearchServerContext() {\n  return useContext(InstantSearchServerContext);\n}","import { useEffect, useLayoutEffect } from 'react';\n\n/**\n * `useLayoutEffect` that doesn't show a warning when server-side rendering.\n *\n * It uses `useEffect` on the server (no-op), and `useLayoutEffect` on the browser.\n */\nexport var useIsomorphicLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect;","import { createContext } from 'react';\nexport var InstantSearchRSCContext = /*#__PURE__*/createContext(null);","import { useContext } from 'react';\nimport { InstantSearchRSCContext } from \"./InstantSearchRSCContext.js\";\nexport function useRSCContext() {\n  return useContext(InstantSearchRSCContext);\n}","function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }\nfunction _iterableToArrayLimit(arr, i) { var _i = null == arr ? null : \"undefined\" != typeof Symbol && arr[Symbol.iterator] || arr[\"@@iterator\"]; if (null != _i) { var _s, _e, _x, _r, _arr = [], _n = !0, _d = !1; try { if (_x = (_i = _i.call(arr)).next, 0 === i) { if (Object(_i) !== _i) return; _n = !1; } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0); } catch (err) { _d = !0, _e = err; } finally { try { if (!_n && null != _i.return && (_r = _i.return(), Object(_r) !== _r)) return; } finally { if (_d) throw _e; } } return _arr; } }\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\nimport { useState } from 'react';\nimport { dequal } from \"./dequal.js\";\nexport function useStableValue(value) {\n  var _useState = useState(function () {\n      return value;\n    }),\n    _useState2 = _slicedToArray(_useState, 2),\n    stableValue = _useState2[0],\n    setStableValue = _useState2[1];\n  if (!dequal(stableValue, value)) {\n    setStableValue(value);\n  }\n  return stableValue;\n}","import * as React from 'react';\nvar useKey = 'use';\n\n// @TODO: Remove this file and import directly from React when available.\nexport var use = React[useKey];","import { useEffect, useRef } from 'react';\nimport { dequal } from \"./dequal.js\";\nimport { use } from \"./use.js\";\nimport { useInstantSearchContext } from \"./useInstantSearchContext.js\";\nimport { useIsomorphicLayoutEffect } from \"./useIsomorphicLayoutEffect.js\";\nimport { useRSCContext } from \"./useRSCContext.js\";\nexport function useWidget(_ref) {\n  var _waitingForResultsRef;\n  var widget = _ref.widget,\n    parentIndex = _ref.parentIndex,\n    props = _ref.props,\n    shouldSsr = _ref.shouldSsr;\n  var waitingForResultsRef = useRSCContext();\n  var prevPropsRef = useRef(props);\n  useEffect(function () {\n    prevPropsRef.current = props;\n  }, [props]);\n  var prevWidgetRef = useRef(widget);\n  useEffect(function () {\n    prevWidgetRef.current = widget;\n  }, [widget]);\n  var cleanupTimerRef = useRef(null);\n  var shouldAddWidgetEarly = shouldSsr && !parentIndex.getWidgets().includes(widget);\n  var search = useInstantSearchContext();\n\n  // This effect is responsible for adding, removing, and updating the widget.\n  // We need to support scenarios where the widget is remounted quickly, like in\n  // Strict Mode, so that we don't lose its state, and therefore that we don't\n  // break routing.\n  useIsomorphicLayoutEffect(function () {\n    var previousWidget = prevWidgetRef.current;\n\n    // Scenario 1: the widget is added for the first time.\n    if (!cleanupTimerRef.current) {\n      if (!shouldAddWidgetEarly) {\n        parentIndex.addWidgets([widget]);\n      }\n    }\n    // Scenario 2: the widget is rerendered or updated.\n    else {\n      // We cancel the original effect cleanup because it may not be necessary if\n      // props haven't changed. (We manually call it if it is below.)\n      clearTimeout(cleanupTimerRef.current);\n\n      // Warning: if an unstable function prop is provided, `dequal` is not able\n      // to keep its reference and therefore will consider that props did change.\n      // This could unsollicitely remove/add the widget, therefore forget its state,\n      // and could be a source of confusion.\n      // If users face this issue, we should advise them to provide stable function\n      // references.\n      var arePropsEqual = dequal(props, prevPropsRef.current);\n\n      // If props did change, then we execute the cleanup function instantly\n      // and then add the widget back. This lets us add the widget without\n      // waiting for the scheduled cleanup function to finish (that we canceled\n      // above).\n      if (!arePropsEqual) {\n        parentIndex.removeWidgets([previousWidget]);\n        parentIndex.addWidgets([widget]);\n      }\n    }\n    return function () {\n      // We don't remove the widget right away, but rather schedule it so that\n      // we're able to cancel it in the next effect.\n      cleanupTimerRef.current = setTimeout(function () {\n        search._schedule(function () {\n          if (search._preventWidgetCleanup) return;\n          parentIndex.removeWidgets([previousWidget]);\n        });\n      });\n    };\n  }, [parentIndex, widget, shouldAddWidgetEarly, search, props]);\n  if (shouldAddWidgetEarly || (waitingForResultsRef === null || waitingForResultsRef === void 0 ? void 0 : (_waitingForResultsRef = waitingForResultsRef.current) === null || _waitingForResultsRef === void 0 ? void 0 : _waitingForResultsRef.status) === 'pending') {\n    parentIndex.addWidgets([widget]);\n  }\n  if (typeof window === 'undefined' && waitingForResultsRef !== null && waitingForResultsRef !== void 0 && waitingForResultsRef.current &&\n  // We need the widgets contained in the index to be added before we trigger the search request.\n  widget.$$type !== 'ais.index') {\n    var _search$helper;\n    use(waitingForResultsRef.current);\n    // If we made a second request because of DynamicWidgets, we need to wait for the second result,\n    // except for DynamicWidgets itself which needs to render its children after the first result.\n    if (widget.$$type !== 'ais.dynamicWidgets' && (_search$helper = search.helper) !== null && _search$helper !== void 0 && _search$helper.lastResults) {\n      use(waitingForResultsRef.current);\n    }\n  }\n}"],"names":["EventEmitter","this","_events","_maxListeners","undefined","isFunction","arg","isObject","isUndefined","module","exports","prototype","defaultMaxListeners","setMaxListeners","n","isNaN","TypeError","emit","type","er","handler","len","args","i","listeners","error","length","arguments","Error","err","context","call","Array","slice","apply","addListener","listener","m","newListener","push","warned","console","trace","on","once","fired","g","removeListener","list","position","splice","removeAllListeners","key","listenerCount","evlistener","emitter","AlgoliaSearchHelper","SearchParameters","SearchResults","algoliasearchHelper","client","index","opts","version","DerivedHelper","mainHelper","fn","main","lastResults","inherits","detach","detachDerivedHelper","getModifiedState","parameters","defaultsPure","objectHasKeys","omit","lib","addRefinement","refinementList","attribute","value","isRefined","valueAsString","facetRefinement","concat","mod","removeRefinement","clearRefinement","v","f","toggleRefinement","refinementType","hasChanged","newRefinementList","Object","keys","reduce","memo","values","facetList","filter","refinementValue","containsRefinements","Boolean","refinementValueAsString","indexOf","find","intersection","merge","valToNumber","isValidUserToken","RefinementList","isEqualNumericRefinement","a","b","isArray","every","el","newParameters","params","_parseNumbers","userToken","warn","facets","disjunctiveFacets","hierarchicalFacets","facetsRefinements","facetsExcludes","disjunctiveFacetsRefinements","numericRefinements","tagRefinements","hierarchicalFacetsRefinements","self","forEach","paramName","isKeyKnown","PARAMETERS","isValueDefined","partialState","numbers","k","parsedValue","parseFloat","insideBoundingBox","map","geoRect","operators","operator","parsedValues","vPrime","make","instance","facet","rootPath","currentRefinement","getHierarchicalRefinement","name","clearRefinements","toggleHierarchicalFacetRefinement","validate","currentState","tagFilters","numericFilters","constructor","patch","_clearNumericRefinements","setQueryParameters","clearTags","setIndex","setQuery","newQuery","query","setPage","newPage","page","setFacets","setDisjunctiveFacets","setHitsPerPage","hitsPerPage","setTypoTolerance","typoTolerance","addNumericRefinement","val","isNumericRefined","getConjunctiveRefinements","facetName","isConjunctiveFacet","getDisjunctiveRefinements","isDisjunctiveFacet","getExcludeRefinements","removeNumericRefinement","number","paramValue","op","getNumericRefinements","getNumericRefinement","newNumericRefinements","operatorList","outValues","addFacet","addDisjunctiveFacet","addHierarchicalFacet","hierarchicalFacet","isHierarchicalFacet","addFacetRefinement","addExcludeRefinement","addDisjunctiveFacetRefinement","addTagRefinement","tag","isTagRefined","modification","removeFacet","removeDisjunctiveFacet","removeHierarchicalFacet","removeFacetRefinement","removeExcludeRefinement","removeDisjunctiveFacetRefinement","removeTagRefinement","t","toggleFacetRefinement","toggleConjunctiveFacetRefinement","toggleDisjunctiveFacetRefinement","toggleExcludeFacetRefinement","separator","_getHierarchicalFacetSeparator","getHierarchicalFacetByName","lastIndexOf","addHierarchicalFacetRefinement","path","isHierarchicalFacetRefined","removeHierarchicalFacetRefinement","toggleTagRefinement","isFacetRefined","isExcludeRefined","isDisjunctiveFacetRefined","refinements","isOperatorDefined","array","searchedValue","isAttributeValueDefined","currentValue","getRefinedDisjunctiveFacets","disjunctiveNumericRefinedFacets","getRefinedHierarchicalFacets","sort","getUnrefinedDisjunctiveFacets","refinedFacets","managedParameters","getQueryParams","queryParams","setQueryParameter","parameter","nextWithNumbers","previousPlainObject","acc","nextPlainObject","previous","isPreviousValueDefined","isNextValueDefined","resetPage","_getHierarchicalFacetSortBy","sortBy","_getHierarchicalRootPath","_getHierarchicalShowParentLevel","showParentLevel","hierarchicalFacetName","getHierarchicalFacetBreadcrumb","refinement","split","part","trim","toString","JSON","stringify","state","hierarchicalFacetResult","hierarchicalFacetIndex","hierarchicalFacetRefinement","hierarchicalSeparator","hierarchicalRootPath","hierarchicalShowParentLevel","prepareHierarchicalFacetSortBy","rootExhaustive","facetResult","exhaustive","generateTreeFn","hierarchicalTree","currentHierarchicalLevel","parent","level","data","subtree","picked","facetValue","tuple","parentPath","onlyMatchingTree","orderBy","facetCount","parts","escapedValue","escapeFacetValue","count","format","unescapeFacetValue","generateHierarchicalTree","results","fv","compact","findIndex","formatSort","getIndices","attributes","indices","idx","assignFacetStats","dest","facetStats","stats","options","mainSubResponse","_rawResults","processingTimeMS","sum","result","facetsIndices","disjunctiveFacetsIndices","nextDisjunctiveResult","mainFacets","facetKey","hierarchicalAttributeName","facetValueObject","facetIndex","idxAttributeName","exhaustiveFacetsCount","isFacetDisjunctive","isFacetConjunctive","facets_stats","disjunctiveFacet","dfacet","facetResults","attributeIndex","dataFromMainRequest","refinedFacet","defaultData","root","excludes","_state","extractNormalizedFacetValues","predicate","isExcluded","hierarchicalFacetValues","replace","currentRefinementSplit","unshift","setIsRefined","item","depth","child","recSort","sortFn","node","names","children","childNode","sortedChildren","getFacetStatsIfAvailable","getRefinement","attributeName","resultsFacets","getFacetByName","DEFAULT_SORT","getFacetValues","facetValues","facetOrdering","renderingContent","getFacetOrdering","orderedFacets","remainingFacets","reverseOrder","order","ordering","sortRemainingBy","sortViaFacetOrdering","vanillaSortFn","getFacetStats","getRefinements","res","facetDeclaration","rootFacet","intermediateFacet","newFacet","numericValue","requestBuilder","addAlgoliaAgent","setClient","_queryId","_lastQueryIdReceived","derivedHelpers","_currentNbQueries","setCurrentPage","_change","isPageReset","getCurrentPage","search","_search","onlyWithDerivedHelpers","searchOnlyWithDerivedHelpers","getQuery","_getHitsSearchParams","searchOnce","cb","tempState","queries","_getQueries","then","content","_originalResponse","e","catch","findAnswers","derivedHelper","Promise","resolve","derivedState","attributesForPrediction","nbHits","errorMessage","initIndex","queryLanguages","searchForFacetValues","maxFacetHits","userState","clientHasSFFV","clientHasInitIndex","isDisjunctive","algoliaQuery","getSearchForFacetQuery","searchForFacetValuesPromise","indexName","response","facetHits","q","addDisjunctiveRefine","addRefine","addFacetExclusion","addExclude","addTag","removeDisjunctiveRefine","removeRefine","removeFacetExclusion","removeExclude","removeTag","toggleFacetExclusion","toggleExclude","toggleRefine","toggleTag","nextPage","previousPage","setState","newState","overrideStateWithoutTriggeringChangeEvent","hasRefinements","isDisjunctiveRefined","hasTag","hasTagRefinements","getIndex","getPage","getTags","r","states","mainQueries","queriesCount","helper","derivedQueries","derivedStateQueries","queryId","_dispatchAlgoliaResponse","bind","_dispatchAlgoliaError","s","specificResults","containsRefinement","facetFilters","_hasDisjunctiveRefinements","disjunctiveRefinements","event","clearCache","newClient","getClient","derive","pos","hasPendingRequests","reduceRight","source","String","comparator","defaults","defaultInstructions","out","sortInstruction","matchingDefault","defaultInstruction","ctor","superCtor","create","enumerable","writable","configurable","arr1","arr2","isObjectOrArrayOrFunction","_merge","target","hasOwnProperty","sourceVal","targetVal","l","obj","excluded","sourceKeys","compareAscending","other","valIsDefined","valIsNull","othIsDefined","othIsNull","collection","iteratees","orders","criteria","iteratee","object","sortObject","curr","_getDisjunctiveFacetSearchParams","filtersMap","segment","join","hasHierarchicalFacetFilter","some","filteredFacetFilters","facetFilter","filtered","filterValue","_getHitsHierarchicalFacetsAttributes","_getFacetFilters","_getNumericFilters","_getTagFilters","additionalParams","hierarchicalRootLevel","analytics","clickAnalytics","_getDisjunctiveHierarchicalFacetAttribute","vs","orFilters","attributeToRefine","attributesIndex","allAttributes","hierarchicalRefinement","newAttributes","rootLevel","parentLevel","stateForSearchForFacetValues","searchForFacetSearchParameters","facetQuery","test","percentTwenties","Format","formatters","RFC1738","RFC3986","parse","formats","utils","has","allowDots","allowPrototypes","arrayLimit","charset","charsetSentinel","comma","decoder","decode","delimiter","ignoreQueryPrefix","interpretNumericEntities","parameterLimit","parseArrays","plainObjects","strictNullHandling","str","$0","numberStr","fromCharCode","parseInt","parseArrayValue","parseKeys","givenKey","valuesParsed","exec","chain","leaf","cleanRoot","charAt","parseObject","isRegExp","normalizeParseOptions","tempObj","cleanStr","limit","Infinity","skipIndex","bracketEqualsPos","maybeMap","encodedVal","combine","parseValues","newObj","arrayPrefixGenerators","brackets","prefix","repeat","pushToArray","arr","valueOrArray","toISO","Date","toISOString","defaultFormat","addQueryPrefix","encode","encoder","encodeValuesOnly","formatter","serializeDate","date","skipNulls","generateArrayPrefix","isBuffer","keyValue","valuesArray","valuesJoined","objKeys","j","keyPrefix","normalizeStringifyOptions","arrayFormat","joined","hexTable","toUpperCase","arrayToObject","assign","queue","o","prop","refs","pop","compacted","compactQueue","strWithoutPlus","unescape","decodeURIComponent","defaultEncoder","kind","string","Symbol","escape","c","charCodeAt","mapped","mergeTarget","targetItem","is","useState","useEffect","useLayoutEffect","p","useDebugValue","getSnapshot","d","u","window","document","createElement","inst","useSyncExternalStore","getDeps","deps","initialDeps","_a","_b","_c","_d","depTime","debug","now","newDeps","dep","resultTime","depEndTime","Math","round","resultEndTime","resultFpsPercentage","pad","num","info","max","min","onChange","notUndefined","msg","ms","timeoutId","clearTimeout","setTimeout","defaultKeyExtractor","defaultRangeExtractor","range","start","startIndex","overscan","end","endIndex","observeElementRect","element","scrollElement","rect","width","height","getBoundingClientRect","ResizeObserver","observer","entries","entry","borderBoxSize","box","inlineSize","blockSize","observe","unobserve","addEventListenerOptions","passive","supportsScrollend","observeElementOffset","offset","fallback","isScrollingResetDelay","createHandler","isScrolling","horizontal","endHandler","addEventListener","removeEventListener","measureElement","elementScroll","adjustments","behavior","toOffset","scrollTo","Virtualizer","unsubs","scrollToIndexTimeoutId","measurementsCache","itemSizeCache","Map","pendingMeasuredCacheIndexes","scrollDirection","scrollAdjustments","measureElementCache","_ro","get","_measureElement","disconnect","setOptions","opts2","initialOffset","paddingStart","paddingEnd","scrollPaddingStart","scrollPaddingEnd","getItemKey","rangeExtractor","initialRect","scrollMargin","gap","indexAttribute","initialMeasurementsCache","lanes","notify","force","sync","calculateRange","cleanup","_didMount","_willUpdate","getScrollElement","_scrollToOffset","scrollOffset","scrollRect","prevIsScrolling","getSize","getMeasurementOptions","getFurthestMeasurement","measurements","furthestMeasurementsFound","furthestMeasurements","measurement","lane","previousFurthestMeasurement","set","size","from","getMeasurements","furthestMeasurement","measuredSize","estimateSize","outerSize","getOffset","findNearestBinarySearch","getIndexes","indexFromElement","indexStr","getAttribute","isConnected","cached","delete","prevNode","measuredItemSize","resizeItem","delta","shouldAdjustScrollPositionOnItemSizeChange","getVirtualItems","indexes","virtualItems","getVirtualItemForOffset","getOffsetForAlignment","align","scrollSizeProp","maxOffset","documentElement","getOffsetForIndex","isDynamicMode","cancelScrollToIndex","scrollToOffset","scrollToIndex","initialAlign","toOffset2","abs","scrollBy","getTotalSize","scrollToFn","measure","low","high","getCurrentValue","middle","useIsomorphicLayoutEffect","useVirtualizerBase","rerender","resolvedOptions","instance2","flushSync","selectionStart","selectionEnd","current","HTMLInputElement","activeElement","focus","preventScroll","setSelectionRange","Left","Right","xo","Open","Closed","To","Single","Multi","go","Pointer","Focus","Other","vo","OpenCombobox","CloseCombobox","GoToOption","RegisterOption","UnregisterOption","SetActivationTrigger","UpdateVirtualConfiguration","Te","activeOptionIndex","dataRef","domRef","Oo","disabled","comboboxState","activationTrigger","__demoMode","calculateIndex","optionsRef","optionsPropsRef","static","virtual","_","Specific","resolveItems","resolveActiveIndex","x","V","resolveDisabled","resolveId","F","trigger","id","payload","isSelected","ge","oe","captureStackTrace","displayName","Le","Co","Q","getComputedStyle","paddingBlockStart","paddingTop","paddingBlockEnd","paddingBottom","Provider","style","ref","process","env","JEST_WORKER_ID","option","open","top","left","transform","overflowAnchor","se","yo","Ro","Fo","RenderStrategy","Static","Vo","D","U","defaultValue","form","by","onClose","multiple","immediate","nullable","P","C","y","I","A","h","w","hold","O","W","z","$","X","mode","J","inputRef","buttonRef","N","ae","ve","compare","isActive","closeCombobox","activeIndex","activeOption","de","goToOption","be","te","ne","re","ie","registerOption","openCombobox","setActivationTrigger","selectActiveOption","B","E","R","props","htmlFor","slot","onReset","ourProps","theirProps","defaultTag","Lo","autoFocus","Space","Enter","preventDefault","stopPropagation","nextFrame","ArrowDown","First","ArrowUp","Last","Escape","currentTarget","button","isFocusVisible","focusProps","isHovered","hoverProps","isDisabled","pressed","pressProps","active","hover","tabIndex","onMouseDown","onKeyDown","wo","displayValue","scrollTop","Nothing","requestAnimationFrame","selectionDirection","dispose","Next","Previous","Home","shiftKey","PageUp","End","PageDown","Tab","relatedTarget","contains","isFocused","autofocus","role","onCompositionStart","onCompositionEnd","onFocus","onBlur","Bo","ko","anchor","portal","modal","allowed","container","enabled","accept","NodeFilter","FILTER_REJECT","hasAttribute","FILTER_SKIP","FILTER_ACCEPT","walk","setAttribute","onWheel","features","visible","No","scrollIntoView","block","update","wasMoved","selected","onPointerEnter","onMouseEnter","onPointerMove","onMouseMove","onPointerLeave","onMouseLeave","ht","Input","Button","Label","Options","Option","inherit","register","L","HTMLLabelElement","onClick","getElementById","click","K","clientY","right","clientX","bottom","onPointerDown","onPointerUp","T","as","toLowerCase","HTMLButtonElement","screenX","screenY","acceptNode","createTreeWalker","SHOW_ELEMENT","nextNode","currentNode","getUserAgent","uaData","navigator","userAgentData","brands","_ref","brand","userAgent","deepEqual","$$typeof","getDPR","ownerDocument","defaultView","devicePixelRatio","roundByDPR","dpr","useLatestRef","shift","flip","_node$ownerDocument","Element","SafeReact","useSafeInsertionEffect","useInsertionEffect","useEffectEvent","callback","_len","_key","ARROW_UP","ARROW_DOWN","ARROW_LEFT","ARROW_RIGHT","horizontalKeys","verticalKeys","serverHandoffComplete","genId","random","useId","setId","createPubSub","_map$get","off","_map$get2","FloatingNodeContext","FloatingTreeContext","useFloatingParentNodeId","_React$useContext","useFloatingTree","nodeId","internalRootContext","onOpenChange","onOpenChangeProp","elements","elementsProp","floatingId","events","nested","positionReference","setPositionReference","reference","reason","openEvent","floating","domReference","useFloatingRootContext","rootContext","computedElements","_domReference","setDomReference","_setPositionReference","domReferenceRef","tree","placement","strategy","middleware","platform","externalReference","externalFloating","whileElementsMounted","setData","middlewareData","isPositioned","latestMiddleware","setLatestMiddleware","_reference","_setReference","_floating","_setFloating","setReference","referenceRef","setFloating","floatingRef","referenceEl","floatingEl","hasWhileElementsMounted","whileElementsMountedRef","platformRef","config","fullData","isMountedRef","floatingStyles","initialStyles","willChange","useFloating","computedPositionReference","contextElement","floatingContext","nodesRef","ACTIVE_KEY","SELECTED_KEY","mergeProps","userProps","propsList","elementKey","isItem","domUserProps","__","validProps","propsOrGetProps","includes","getArgsWithCustomFloatingHeight","rects","inner","listRef","overflowRef","onFallbackChange","innerOffset","minItemsVisible","referenceOverflowThreshold","scrollRef","detectOverflowOptions","nextArgs","offsetTop","clientTop","offsetHeight","overflow","scrollHeight","refOverflow","elementContext","diffY","nextY","maxHeight","styles","getReferenceProps","getFloatingProps","S","xe","to","ye","Fe","Re","HTMLElement","outerHTML","MutationObserver","ceil","attributeFilter","pe","M","padding","ce","mainAxis","crossAxis","scrollPaddingBottom","childElementCount","childNodes","clientHeight","H","availableWidth","availableHeight","maxWidth","G","unstable_onChange","controlledScrollingRef","prevScrollTopRef","initialOverflowRef","ctrlKey","dY","deltaY","isAtTop","isAtBottom","remainingScroll","sign","method","onScroll","scrollDiff","getItemProps","Y","getPropertyValue","appendChild","setProperty","marginTop","removeChild","parentElement","HTMLFieldSetElement","HTMLLegendElement","previousElementSibling","$c87311424ea30a05$var$testUserAgent","_window_navigator_userAgentData","$c87311424ea30a05$var$testPlatform","$c87311424ea30a05$export$9ac100e40613ea10","$6a7db85432448f7f$export$60278871457622de","mozInputSource","isTrusted","pointerType","buttons","detail","$431fbd86ca7dc216$export$b204af158042fbac","_el_ownerDocument","$431fbd86ca7dc216$export$f21a1ffae260145a","$507fabe10e71c6fb$var$currentModality","$507fabe10e71c6fb$var$changeHandlers","Set","$507fabe10e71c6fb$export$d90243b58daecda7","$507fabe10e71c6fb$var$hasEventBeforeFocus","$507fabe10e71c6fb$var$hasBlurredWindowRecently","$507fabe10e71c6fb$var$FOCUS_VISIBLE_INPUT_KEYS","$507fabe10e71c6fb$var$triggerChangeHandlers","modality","$507fabe10e71c6fb$var$handleKeyboardEvent","metaKey","altKey","$507fabe10e71c6fb$var$isValidKey","$507fabe10e71c6fb$var$handlePointerEvent","$507fabe10e71c6fb$var$handleClickEvent","$507fabe10e71c6fb$var$handleFocusEvent","$507fabe10e71c6fb$var$handleWindowBlur","$507fabe10e71c6fb$var$setupGlobalFocusEvents","windowObject","documentObject","PointerEvent","$507fabe10e71c6fb$var$tearDownWindowFocusTracking","loadListener","$507fabe10e71c6fb$export$b9b3dfddab17db27","readyState","$507fabe10e71c6fb$export$2f1888112f558a7d","$507fabe10e71c6fb$var$nonTextInputTypes","$507fabe10e71c6fb$export$ec71b4b83ac08ec3","isTextInput","_e_target","IHTMLInputElement","IHTMLTextAreaElement","HTMLTextAreaElement","IHTMLElement","IKeyboardEvent","KeyboardEvent","isContentEditable","$507fabe10e71c6fb$var$isKeyboardFocusEvent","add","$f0a04ccd8dbdd83b$export$e5c5a5f917a5871c","$8ae05eaa5c114e9c$export$7f54fc3180508a52","$8a9cb279dc87e130$export$905e7fc544a71f36","isDefaultPrevented","nativeEvent","defaultPrevented","isPropagationStopped","persist","bubbles","cancelable","eventPhase","timeStamp","$8a9cb279dc87e130$export$715c682d09d639cc","stateRef","dispatchBlur","HTMLSelectElement","onBlurHandler","_stateRef_current_observer","relatedTargetEl","dispatchEvent","FocusEvent","$a1ea59d68270f0dd$export$f8168d8dd8fd66e6","onFocusProp","onBlurProp","onFocusChange","onSyntheticFocus","$9ab94262bd0047c7$export$420e68273165f4ec","onBlurWithin","onFocusWithin","onFocusWithinChange","isFocusWithin","focusWithinProps","$f7dceffc5ad7768b$export$4e328f61c538687f","within","setFocused","isFocusVisibleState","setFocusVisible","updateState","$6179b936705e76d3$var$globalIgnoreEmulatedMouseEvents","$6179b936705e76d3$var$hoverCount","$6179b936705e76d3$var$setGlobalIgnoreEmulatedMouseEvents","$6179b936705e76d3$var$handleGlobalPointerEvent","$6179b936705e76d3$var$setupGlobalTouchEvents","$6179b936705e76d3$export$ae780daf29e6d456","onHoverStart","onHoverChange","onHoverEnd","setHovered","ignoreEmulatedMouseEvents","triggerHoverEnd","triggerHoverStart","onTouchStart","checkRendering","rendering","usage","createDocumentationMessageGenerator","widgets","links","widget","_ref$connector","connector","message","_typeof","iterator","_extends","ownKeys","enumerableOnly","getOwnPropertySymbols","symbols","sym","getOwnPropertyDescriptor","_objectSpread","_defineProperty","getOwnPropertyDescriptors","defineProperties","defineProperty","input","hint","prim","toPrimitive","Number","_toPrimitive","_toPropertyKey","TAG_PLACEHOLDER","highlightPreTag","highlightPostTag","TAG_REPLACEMENT","replaceTagsAndEscape","RegExp","recursiveEscape","escapeHits","hits","__escaped","hit","_objectDestructuringEmpty","_highlightResult","_snippetResult","htmlEntities","regexUnescapedHtml","regexHasUnescapedHtml","character","htmlCharacters","regexEscapedHtml","regexHasEscapedHtml","isIndexWidget","$$type","isPlainObject","isObjectLike","getTag","getPrototypeOf","proto","_excluded","_objectWithoutProperties","_objectWithoutPropertiesLoose","sourceSymbolKeys","propertyIsEnumerable","mergeHierarchicalFacets","nextFacets","mergeSearchParameters","hierarchicalFacetsRefinementsMerged","mergeHierarchicalFacetsRefinements","tagRefinementsMerged","mergeTagRefinements","numericRefinementsMerged","mergeNumericRefinements","disjunctiveFacetsRefinementsMerged","mergeDisjunctiveFacetsRefinements","facetsExcludesMerged","mergeFacetsExcludes","facetRefinementsMerged","mergeFacetRefinements","disjunctiveFacetsMerged","mergeDisjunctiveFacets","ruleContextsMerged","ruleContexts","mergeRuleContexts","facetsMerged","mergeFacets","rest","mergeWithRest","noop","createInitArgs","instantSearchInstance","uiState","getHelper","renderState","templatesConfig","createURL","scopedResults","searchMetadata","isSearchStalled","status","createRenderArgs","getResults","getScopedResults","serializePayload","btoa","encodeURIComponent","_toConsumableArray","_arrayLikeToArray","_arrayWithoutHoles","iter","_iterableToArray","minLen","_unsupportedIterableToArray","_nonIterableSpread","withUsage","privateHelperSetState","_uiState","getLocalWidgetsUiState","widgetStateOptions","initialUiState","getWidgetUiState","getWidgetState","getLocalWidgetsSearchParameters","widgetSearchParametersOptions","initialSearchParameters","getWidgetSearchParameters","resetPageFromWidgets","indexWidgets","widgetHelper","getWidgets","resolveScopedResultsFromWidgets","indexId","getIndexId","widgetParams","_widgetParams$indexId","localWidgets","localUiState","localInstantSearchInstance","localParent","lastValidSearchParameters","$$widgetType","getIndexName","_derivedHelper","getPreviousState","widgetParent","getParent","nextState","_createURL","searchParameters","addWidgets","_this","init","render","getRenderState","storeRenderState","_initialUiState","scheduleSearch","removeWidgets","_this2","_nextState","_ref2","_instantSearchInstanc","_this3","onStateChange","mainIndex","setUiState","searchWithoutTriggeringOnStateChange","resolveSearchParameters","indexInitialResults","_initialResults","_ref3","scheduleStalledRender","_ref4","scheduleRender","onInternalStateChange","_ref5","_this4","widgetsToRender","_helper","_derivedHelper2","_this5","previousUiState","innerIndex","_ref6","refreshUiState","setIndexUiState","indexUiState","nextIndexUiState","_ref7","parentIndexName","getInitialSearchParameters","renderFn","unmountFn","connectorState","initOptions","getWidgetRenderState","renderOptions","_renderState$configur","widgetRenderState","configure","refine","actualState","nextSearchParameters","Configure","additionalWidgetProperties","useConnector","useConfigure","ANONYMOUS_TOKEN_COOKIE_KEY","getInsightsAnonymousUserTokenInternal","cookie","cookies","substring","getCookie","safelyRunOnBrowser","_slicedToArray","_arrayWithHoles","_i","_s","_e","_x","_r","_arr","_n","next","done","return","_iterableToArrayLimit","_nonIterableRest","ALGOLIA_INSIGHTS_VERSION","ALGOLIA_INSIGHTS_SRC","isModernInsightsClient","_split$map2","major","minor","extractWidgetPayload","widgetType","createMetadataMiddleware","_ref2$$$internal","$$internal","payloadContainer","refNode","querySelector","subscribe","ua","transporter","_ua","internal","started","unsubscribe","remove","_defineProperties","descriptor","setWindowTitle","title","BrowserHistory","windowTitle","_ref$writeDelay","writeDelay","parseURL","getLocation","Constructor","_classCallCheck","writeTimer","_start","_dispose","_push","read","latestAcknowledgedHistory","history","protoProps","staticProps","qsModule","location","routeState","url","shouldWrite","pushState","inPopState","_onPopState","isDisposed","write","lastPushWasByISAfterDispose","href","getIndexStateWithoutConfigure","isPrimitive","isEqual","first","second","_Object$keys","createRouterMiddleware","_props$router","router","_ref7$createURL","_ref8","protocol","hostname","_location$port","port","pathname","hash","queryString","portWithPrefix","_ref7$parseURL","_ref9","_ref7$writeDelay","_ref7$getLocation","_ref10","historyRouter","_props$stateMapping","stateMapping","stateToRoute","routeToState","_props$$$internal","route","lastRouteState","onUpdate","_router$start","component","componentName","descendantName","modifierName","descendent","modifier","getPropertyByPath","suit","concatHighlightedParts","isHighlighted","hasAlphanumeric","getHighlightFromSiblings","_parts","_parts2","isNextHighlighted","isPreviousHighlighted","reverseHighlightedParts","getHighlightedParts","highlightedValue","splitByPreTag","firstValue","splitByPostTag","serializedPayload","writeDataAttributes","hoganHelpers","numberLocale","formatNumber","toLocaleString","highlight","_ref$highlightedTagNa","highlightedTagName","_ref$cssClasses","cssClasses","_ref2$value","attributeValue","className","highlighted","reverseHighlight","snippet","reverseSnippet","insights","_JSON$parse","objectIDs","objectID","nextMicroTask","defer","progress","cancelled","wait","cancel","setIndexHelperState","finalUiState","indexWidget","_setPrototypeOf","setPrototypeOf","__proto__","_createSuper","Derived","hasNativeReflectConstruct","Reflect","construct","sham","Proxy","valueOf","_isNativeReflectConstruct","Super","_getPrototypeOf","NewTarget","_assertThisInitialized","_possibleConstructorReturn","ReferenceError","defaultCreateURL","InstantSearch","_EventEmitter","subClass","superClass","_inherits","_super","_this$mainHelper","shouldResetStatus","_searchStalledTimer","nextUiState","_options$indexName","_options$initialUiSta","_options$routing","routing","_options$insights","searchFunction","_options$stalledSearc","stalledSearchDelay","_options$searchClient","searchClient","_options$insightsClie","insightsClient","_options$onStateChang","helpers","compileOptions","_stalledSearchDelay","_searchFunction","sendEventToInsights","routerOptions","use","insightsOptions","_insightsClient","insightsInitParams","onEvent","potentialInsightsClient","pointer","AlgoliaAnalyticsObject","shouldAddScript","existingInsightsMiddlewares","creator","unuse","initialParameters","_getAppIdAndApiKey2","_searchClient$transpo","headers","queryParameters","APP_ID","API_KEY","applicationID","apiKey","getAppIdAndApiKey","appId","queuedUserToken","userTokenBeforeInit","items","reverse","_error","partial","script","async","src","onerror","body","cause","setUserTokenToSearch","existingToken","applyToken","anonymousUserToken","insightsClientWithLocalCredentials","insightsMethod","algoliaSource","eventModifier","createInsightsMiddleware","_window$navigator","_window$navigator$use","newMiddlewareList","newMiddleware","_len2","middlewareToUnuse","_key2","fakeClient","_mainHelperSearch","mainIndexHelper","searchFunctionHelper","originalScheduleSearch","_this$mainHelper2","callOnStateChange","defaultUserAgents","serverUserAgent","nextUserAgent","nextVersion","addAlgoliaAgents","userAgents","_next2","_process$env","forceUpdate","useForceUpdate","serverContext","useInstantSearchServerContext","serverState","useInstantSearchSSRContext","waitingForResultsRef","useRSCContext","initialResults","prevPropsRef","useRef","shouldRenderAtOnce","searchRef","ssrSearchRef","_schedule","timer","NEXT_RUNTIME","notifyServer","_props$stalledSearchD","prevProps","cleanupTimerRef","store","useCallback","_preventWidgetCleanup","useInstantSearchApi","InstantSearchContext","IndexContext","_buildEventPayloadsForHits","methodName","_args$0$split2","eventType","eventName","hitsArray","queryID","__queryID","hitsChunks","chunkSize","chunks","chunk","objectIDsByChunk","batch","positionsByChunk","__position","positions","sendEvent","bindEvent","_ref$escapeHTML","escapeHTML","_ref$transformItems","transformItems","sentEvents","createSendEventForHits","payloads","createBindEventForHits","hitsWithAbsolutePositionAndQueryID","addQueryID","useHits","defaultQueryHook","hook","_refine","_clear","_ref$queryHook","queryHook","searchBox","clear","useSearchBox","createSearchResults","_state$query","_state$page","_state$hitsPerPage","nbPages","exhaustiveNbHits","__isArtificial","_excluded2","useInstantSearchContext","parentIndex","useIndexContext","stableProps","useStableValue","stableAdditionalWidgetProperties","shouldSetStateRef","previousRenderStateRef","previousStatusRef","useMemo","isFirstRender","dequal","Function","createWidget","_useState2","_widget$getWidgetSear","_getIndexSearchResult","scopedResult","fallbackResults","getIndexSearchResults","_widget$getWidgetRend","useWidget","shouldSsr","createContext","foo","bar","getTime","invariant","condition","useReducer","useContext","InstantSearchSSRContext","InstantSearchServerContext","InstantSearchRSCContext","stableValue","setStableValue","_waitingForResultsRef","prevWidgetRef","_search$helper","shouldAddWidgetEarly","previousWidget"],"sourceRoot":""}