{"version":3,"file":"common.b5b10ff5a0e5a6a291f1.js","mappings":"iEAKA,yBAmGA,OA9FW,EAAAA,UAAP,SAAiBC,GACb,IAAIC,EAAc,GAMlB,OALAC,SAASD,OAAOE,MAAM,KAAKC,SAAQ,SAAUC,GACrC,M,uRAAA,CAAeA,EAAGF,MAAM,KAAI,GAA3BG,EAAG,KAAEC,EAAK,KACfN,EAAOK,EAAIE,QAAUD,KAGlBN,EAAOD,IAGX,EAAAS,UAAP,SAAiBC,EAAcH,EAAYI,GACvC,IAAIC,EAAU,GACd,GAAID,EAAM,CACN,IAAIE,EAAO,IAAIC,KACfD,EAAKE,QAAQF,EAAKG,UAAoB,GAAPL,EAAY,GAAK,GAAK,KACrDC,EAAU,aAAeC,EAAKI,mBAG9BL,EAAU,oBAEdV,SAASD,OAASS,EAAO,KAAOH,GAAS,IAAMK,EAAU,YAGtD,EAAAM,iBAAP,SAAwBR,EAAcH,GAGlCL,SAASD,OAASS,EAAO,KAAOH,GAAS,IAAvBG,6BAIf,EAAAS,qBAAP,WACI,OAAOC,KAAKC,oBAAoBC,OAAOC,SAASC,OAG7C,EAAAC,qBAAP,WACI,OAAOL,KAAKC,oBAAoBC,OAAOC,SAASG,SAG7C,EAAAL,oBAAP,SAA2BM,GACvB,IAAIC,EAAS,GAEb,GAAID,EAGA,IAFA,IACIE,EADOF,EAAIG,UAAU,GACR3B,MAAM,KACd4B,EAAI,EAAGA,EAAIF,EAAMG,OAAQD,IAAK,CACnC,IAAIE,EAAYJ,EAAME,GAAG5B,MAAM,KAC/B,GAAwB,GAApB8B,EAAUD,OAAa,CACvB,IAAI1B,EAAM2B,EAAU,GAChB1B,EAAQ0B,EAAU,GACtBL,EAAOM,KAAK,CAAE5B,IAAKA,EAAKC,MAAOA,KAK3C,OAAOqB,GAGJ,EAAAO,yCAAP,SAAgDC,GAC5C,IAAIC,EAAaD,EAAYE,SAAS,gBACtCF,EAAYG,KAAK,4BAA4BC,MAAK,SAAUC,GACxD,IAAIC,EAAMxC,SAASyC,cAAcF,GACjCG,YAAW,WACP,IAAIC,EAAYH,EAAII,QAAQ,iBAAiBC,KAAKV,EAAa,kBAAoB,mBAE/EK,EAAIM,KAAK,YACTN,EAAIM,KAAK,WAAYH,GAEhBH,EAAI,GAAGO,MACZP,EAAI,GAAGO,IAAMJ,KAElB,OAIJ,EAAAK,YAAP,SAAmBC,EAAeC,EAAgBC,GAC9C,OAAIC,aAAaC,kBACTF,EAAOG,WAAW,OAClBH,EAASA,EAAOvB,UAAU,IAEvB,mEAA4DqB,EAAK,mBAAWC,EAAM,wBAAgBC,IAGlG,sDAA+CC,aAAaG,sBAAqB,YAAIJ,EAAM,YAAIF,EAAK,YAAIC,IAKhH,EAAAM,KAAP,SAAYC,GACR,OAAOC,mBAAmBC,OAAOC,KAAKH,MAGnC,EAAAI,KAAP,SAAYhB,GACR,OAAOiB,KAAKC,SAASC,mBAAmBnB,MAhGrC,EAAAoB,aAAe,SAACzD,GACnBR,SAASD,OAASS,EAAO,qDAiGjC,EAnGA,KCJI0D,EAA2B,GAG/B,SAASC,EAAoBC,GAE5B,IAAIC,EAAeH,EAAyBE,GAC5C,QAAqBE,IAAjBD,EACH,OAAOA,EAAaE,QAGrB,IAAIC,EAASN,EAAyBE,GAAY,CAGjDG,QAAS,IAOV,OAHAE,EAAoBL,GAAUI,EAAQA,EAAOD,QAASJ,GAG/CK,EAAOD,QCpBfJ,EAAoBO,EAAI,CAACH,EAASI,KACjC,IAAI,IAAIvE,KAAOuE,EACXR,EAAoBS,EAAED,EAAYvE,KAAS+D,EAAoBS,EAAEL,EAASnE,IAC5EyE,OAAOC,eAAeP,EAASnE,EAAK,CAAE2E,YAAY,EAAMC,IAAKL,EAAWvE,MCJ3E+D,EAAoBS,EAAI,CAACK,EAAKC,IAAUL,OAAOM,UAAUC,eAAeC,KAAKJ,EAAKC,GCAlF,SAAYI,EAAGC,EAAKjB,GACnB,aAOA,IAAIkB,EAAY,GAChBF,EAAEE,UAAcA,EAEhBA,EAAUC,GAAU,YACpBD,EAAUE,OAAU,eACpBF,EAAUG,QAAU,QACpBH,EAAUI,QAAU,6EAEpB,IAOIC,EACAC,EARAC,EAAc,aACdC,EAAOT,EAAIS,KACXC,EAAOV,EAAIW,qBAAqB,QAAQ,IAAMF,EAE9CG,EAAQZ,EAAIa,iBAAiB,gBAC7BC,EAAWd,EAAIa,iBAAiB,8BAIhCE,GAAe,EACfC,GAAe,EAEfC,EAAa,iBACbC,EAAY,gBAUhBjB,EAAUkB,YAAc,WACvBP,EAAQZ,EAAIa,iBAAiB,gBAC7B,IACIvE,EADA8E,EAAQX,EAAKY,mBAAqB,KAGtC,IAAK/E,EAAI,EAAGA,EAAIsE,EAAMrE,OAAQD,IAC7BmE,EAAKa,aAAcV,EAAMtE,GAAI8E,IAe/BnB,EAAUsB,aAAe,WACxB,IACIC,EACAlF,EAFAmF,EAAUzB,EAAIa,iBAAiB,qBAInC,IAAMvE,EAAI,EAAGA,EAAImF,EAAQlF,OAAQD,IAAM,CAGtC,IAAIoF,GAFJF,EAAOC,EAAQnF,IAEUqF,aAAa,mBAClCC,EAAUJ,EAAKG,aAAa,QAOT,WAAlBH,EAAKK,WACTL,EAAKM,aAAa,OAAQ,UAC1BN,EAAKO,SAAW,GAOM,KAAlBL,GAAwBE,IAC5BJ,EAAKM,aAAa,kBAAmBF,EAAQlH,MAAM,KAAK,IACxDgH,EAAgBE,EAAQlH,MAAM,KAAK,IASpC8G,EAAKQ,gBAAgB,QAOhBN,GAmBCF,EAAKS,aAAa,cAAgBT,EAAKS,aAAa,wBACxDT,EAAKQ,gBAAgB,YAUtBR,EAAKQ,gBAAgB,UAMrBR,EAAKU,GAAKR,EAAgB,aAAeF,EAAKK,SAAW,IAAMvF,EAK/DkF,EAAKW,iBAAiB,QAASlC,EAAUmC,WACzCZ,EAAKW,iBAAiB,UAAWlC,EAAUoC,WAAW,IAGtDC,QAAQC,KAAK,6DAUhBtC,EAAUuC,WAAa,WACtB,IAAIhB,EACAlF,EAEJ,IADAsE,EAAQZ,EAAIa,iBAAiB,gBACvBvE,EAAI,EAAGA,EAAIsE,EAAMrE,OAAQD,IAAM,CAEpC,IAAImG,GADJjB,EAAOZ,EAAMtE,IACUqF,aAAa,cAChCe,EAAclB,EAAKG,aAAa,qBAAuB,aACvDgB,EAAcnB,EAAKtE,cAAc,0BACjC0F,EAAcpB,EAAKG,aAAa,oBAChCkB,EAAcrB,EAAKS,aAAa,2BAChCa,EAActB,EAAKtE,cAAc,4BACjC6F,EAAcvB,EAAKtE,cAAc,yBAiGrC,GA3FmB,UAAduF,EACJjB,EAAKM,aAAa,OAAQ,eAG1BN,EAAKM,aAAa,OAAQ,UAO3BN,EAAKwB,UAAUC,IAAIP,GAQnBlB,EAAK0B,QAAS,EAOd1B,EAAKO,SAAW,KAYXgB,GACJA,EAASjB,aAAa,OAAQ,YAQ/B7B,EAAUkD,mBAAmB3B,EAAMkB,EAAUD,GA0BxCjB,EAAKS,aAAa,oBACtBT,EAAKM,aAAa,aAAc,QAQ5BgB,IACJA,EAAUZ,GAAKY,EAAUZ,IAAM,WAAakB,KAAKC,MAAsB,IAAhBD,KAAKE,UAAkB,EAC9E9B,EAAKM,aAAa,mBAAoBgB,EAAUZ,KAO5CU,EACJpB,EAAKM,aAAa,aAAcc,QAGhC,GAAKD,EAAU,CACd,IAAIY,EAAc/B,EAAKU,GAAK,WAC5BS,EAAQK,UAAUC,IAAIP,EAAW,aACjCC,EAAQT,GAAKqB,EAKb/B,EAAKM,aAAa,kBAAmByB,GAEhCZ,EAAQV,aAAa,oBACzBU,EAAQZ,SAAW,WAIpBO,QAAQC,KAAK,yEAQVM,GACJrB,EAAKtE,cAAc,IAAMyF,EAAQT,IAAIc,UAAUC,IAAI,WAOpD,IAAIO,EAAYhC,EAAKX,iBA/QA,0WAgRrB2C,EAAU,GAAGR,UAAUC,IAAIhC,GAC3BuC,EAAUA,EAAUjH,OAAS,GAAGyG,UAAUC,IAAI/B,KAShDjB,EAAUkD,mBAAqB,SAAW3B,EAAMiC,EAAYhB,GAC3D,IAMInG,EANAoH,EAAgBlC,EAAKS,aAAa,2BAClC0B,EAAcnC,EAAKX,iBAAiB,0BACpC+C,EAAapC,EAAKG,aAAa,oBAC/BkC,EAAkBrC,EAAKG,aAAa,0BAKxC,IAAM+B,GACAC,EAAYpH,OAAS,EAAI,CAC7B,IAAIuH,EAAW9D,EAAI+D,cAAc,UACjCD,EAASE,KAAO,SAQhBxC,EAAKwB,UAAUC,IAAIQ,GACnBK,EAASd,UAAUC,IAAIQ,EAAa,eAU9BG,GAA4B,UAAdnB,GAMnBqB,EAASG,UAAYL,EAEhBC,GACJC,EAASd,UAAUC,IAAIY,KARxBC,EAASG,UA3BI,6BA4BbH,EAAShC,aAAa,aAAc,SACpCgC,EAASd,UAAUC,IAAI,gBAUL,UAAdR,IACCjB,EAAKtE,cAAc,qBACvBsE,EAAKtE,cAAc,qBAAqBgH,YAAYJ,GAGpDtC,EAAK0C,YAAYJ,IAInBA,EAAS3B,iBAAiB,QAASlC,EAAUkE,YAI/C,IAAM7H,EAAI,EAAGA,EAAIqH,EAAYpH,OAAQD,IACpCqH,EAAYrH,GAAG6F,iBAAiB,QAASlC,EAAUkE,YAGpDnE,EAAImC,iBAAiB,UAAWlC,EAAUoC,WAAW,IAOtDpC,EAAUmC,UAAY,SAAWgC,EAAGC,GACnC,IAAI/H,EACAgI,EAAiBD,GAAY1I,KAAKgG,aAAa,mBAI/C4C,EAFJhE,EAAcP,EAAIwE,eAAeF,GAG7BG,EAAelE,EAAYrD,cAAc,gBAAkBqD,EAAYrD,cAAc,oBAqDzF,GAnDA6D,EAAeR,EAAY0B,aAAa,cAQnCoC,IACJrD,GAAe,GAOVqD,IAKLD,EAAEM,iBAKFpE,EAAiB3E,KAAKuG,IAWlBuC,EACJF,EAAcE,EAELlE,EAAY0B,aAAa,4BAClCsC,EAAchE,EAAYrD,cAAc,yBAUnCuD,EAAKuC,UAAU2B,SAASnE,GAoB7B8B,QAAQC,KAAK,8MAjBb,IAFA9B,EAAKuC,UAAUC,IAAIzC,GAEblE,EAAI,EAAGA,EAAIwE,EAASvE,OAAQD,IAC3ByE,IACAD,EAASxE,GAAG2F,aAAa,gBAC7BnB,EAASxE,GAAGwF,aAAa,mBAAoBhB,EAASxE,GAAGqF,aAAa,gBAEvEb,EAASxE,GAAGwF,aAAa,cAAe,SAGpChB,EAASxE,GAAGqF,aAAa,SAC7Bb,EAASxE,GAAGwF,aAAa,kBAAmB,IAG5ChB,EAASxE,GAAGwF,aAAa,QAAS,QAoBrC,OAZAvB,EAAYyB,gBAAgB,UAK5B4C,uBAAsB,WACnBL,EAAYM,WAGf7E,EAAImC,iBAAiB,YAAalC,EAAU6E,cAAc,GAC1D9E,EAAImC,iBAAiB,WAAYlC,EAAU6E,cAAc,GAElD,CAACxE,EAAgBC,EAAaS,IAUtCf,EAAUkE,WAAa,SAAWC,GACjC,IACI9H,EACAyI,EAFAtD,EAAUzB,EAAIwE,eAAelE,IAAmB,KASpD,IAAMhE,EAAI,EAAGA,EAAIwE,EAASvE,OAAQD,IAC3BwE,EAASxE,GAAG2F,aAAa,oBAC9BnB,EAASxE,GAAG0F,gBAAgB,SAG7BlB,EAASxE,GAAG0F,gBAAgB,mBAEvBlB,EAASxE,GAAGqF,aAAa,oBAC7Bb,EAASxE,GAAGwF,aAAa,cAAehB,EAASxE,GAAGqF,aAAa,qBAGjEb,EAASxE,GAAG0F,gBAAgB,eAG7BlB,EAASxE,GAAG0F,gBAAgB,oBAU7B,IAFAvB,EAAKuC,UAAUgC,OAAOxE,GAEhBuE,EAAI,EAAGA,EAAInE,EAAMrE,OAAQwI,IACxBnE,EAAMmE,GAAG9C,aAAa,YAC3BrB,EAAMmE,GAAG7B,QAAS,GA4BpB,OAlBiB,OAAZzB,EACJA,EAAQoD,QAGHnE,IAASM,GACbN,EAAKqB,UAAY,EACjBrB,EAAKmE,UAGLpE,EAAKsB,UAAY,EACjBtB,EAAKoE,SAQA,CAJPvE,EAAiBvB,EACjBwB,EAAcxB,EACdiC,GAAe,IAUhBf,EAAUoC,UAAY,SAAW+B,GAChC,IAKIa,EAAYC,EALZC,EAAWf,EAAEe,SAAWf,EAAEgB,MAO9B,GAAKhB,EAAEiB,OAAOpD,aAAa,mBAC1B,OAASkD,GACR,KAPa,GAQb,KAPa,GAQZf,EAAEM,iBACFN,EAAEiB,OAAOC,QAKP7E,EAAKuC,UAAU2B,SAASnE,KAhBd,KAiBL2E,GAEPlF,EAAUkE,aAOP1D,EAAKuC,UAAU2B,SAASnE,KAE5ByE,EAAa1E,EAAYrD,cAAc,IAAM+D,GAC7CiE,EAAY3E,EAAYrD,cAAc,IAAMgE,IAGxClB,EAAIuF,cAAcvC,UAAU2B,SAASzD,KA7B5B,IA8BRiE,GAAuBf,EAAEoB,WAC7BpB,EAAEM,iBACGO,IAAelG,GACnBkG,EAAWJ,UAKT7E,EAAIuF,cAAcvC,UAAU2B,SAAS1D,IAtC5B,IAuCRkE,GAAsBf,EAAEoB,WAC5BpB,EAAEM,iBACGQ,IAAcnG,GAClBmG,EAAUL,WAaf5E,EAAU6E,aAAe,SAAWV,GAC9B3D,EAAKuC,UAAU2B,SAASnE,KAAiB4D,EAAEiB,OAAOpD,aAAa,qBAC/C1B,EAAYoE,SAASP,EAAEiB,SAEiB,gBAArC9E,EAAYoB,aAAa,SAC/C1B,EAAUkE,eASblE,EAAUwF,SAAW,WACpB,IAEIpB,EAFAqB,EAAU1F,EAAIa,iBAAiB,qBAC/B8E,EAAY5F,EAAEjE,SAASC,MAAQ,KAE/B6J,GAAU,EASd,GAAmB,OAAdD,EAAqB,CAIzB,GAAkB,MAHlBtB,EAAWsB,EAAUjL,MAAM,KAAK,IAI/B,OAAO,EAEH,GAAkB,UAAb2J,EACT,OAAO,EAIP,IAAIwB,EAAiB7F,EAAIwE,eAAeH,IAAa,KAG7B,OAAnBwB,IAGyC,WAAxCA,EAAelE,aAAa,SAAgE,gBAAxCkE,EAAelE,aAAa,UACpFiE,GAAU,IA0BTA,GACJ3F,EAAUmC,UAtDH,KAsDiBiC,GAEnBqB,EAAQnJ,OAAS,GACrB+F,QAAQC,KAAK,0DAGc,IAAnBmD,EAAQnJ,SACwB,WAApCmJ,EAAQ,GAAG/D,aAAa,SAA4D,gBAApC+D,EAAQ,GAAG/D,aAAa,SAE5E0C,EAAWqB,EAAQ,GAAGxD,GACtBjC,EAAUmC,UAhEJ,KAgEkBiC,GAEnBqB,EAAQnJ,OAAS,GACrB+F,QAAQC,KAAK,8CAG+B,WAApCmD,EAAQ,GAAG/D,aAAa,SAA+C,WAAvB+D,EAAQ,GAAGI,UACnEzB,EAAWqB,EAAQ,GAAGxD,GACtBwD,EAAQ,GAAGJ,UAaU,IAAnBI,EAAQnJ,QAAiByD,EAAIwE,eAAeH,GAAUpC,aAAa,4BACvElC,EAAEjE,SAASiK,QAAQ,WAUrB9F,EAAU+F,KAAO,WAChB/F,EAAUkB,cACVlB,EAAUsB,eACVtB,EAAUuC,aACVvC,EAAUwF,YAOXxF,EAAU+F,OAxuBX,CA0uBInK,OAAQpB,U,gCCjuBZ,SAASwL,EAAgBC,GAErB,IADA,IAAIlJ,EAAQ,EACJkJ,EAAOA,EAAKC,wBAChBnJ,IAEJ,OAAOA,EAIX,SAASoJ,EAASC,G,QAEd,GAAIC,OAAO5I,MAAQ,KAAM,CACrB2I,EAAKvE,aAAa,eAAgB,KAClC,IAAIyE,EAAS9L,SAASoG,iBAAiB,yBAAyB,GAC5D0F,IAC8D,QAA9D,EAAAA,EAAOrJ,cAAc,iDAAyC,SAAE4E,aAAa,eAAgB,QACxB,QAArE,EAAAyE,EAAOrJ,cAAc,wDAAgD,SAAE4E,aAAa,gBAAiB,QACrGyE,EAAO1F,iBAAiB,wBAAwB,GAAGiB,aAAa,cAAe,cAInFuE,EAAKvE,aAAa,eAAgB,KAK1C,SAAS0E,EAAUH,GACfA,EAAKxF,iBAAiB,mBAAmBlG,SAAQ,SAAU8L,GACvDA,EAAK3E,aAAa,gBAAiB,YAEvCuE,EAAKxF,iBAAiB,0CAA0ClG,SAAQ,SAAU8L,GAC9EA,EAAK3E,aAAa,cAAe,YAErCuE,EAAKxF,iBAAiB,kBAAkBlG,SAAQ,SAAU8L,GACtDA,EAAK3E,aAAa,eAAgB,YAEtCuE,EAAKxF,iBAAiB,WAAWlG,SAAQ,SAAU8L,GAC/CA,EAAKzD,UAAUgC,OAAO,aAG1BoB,EAASC,GAIb,SAASK,EAAWC,EAAsBC,G,UACtCD,EAAQ7E,aAAa,gBAA6B,OAAX8E,EAAmB,OAAS,SACpD,OAAXA,EACqB,QAArB,EAAAD,EAAQE,qBAAa,SAAE7D,UAAUC,IAAI,UAEhB,QAArB,EAAA0D,EAAQE,qBAAa,SAAE7D,UAAUgC,OAAO,UAGlB,QAA1B,EAAA2B,EAAQG,0BAAkB,SAAEhF,aAAa,cAA2B,OAAX8E,EAAmB,OAAS,SAsCzF,GAAInM,SAASsM,gBAAgB/D,UAAU2B,SAAS,SAAU,CAItD,GAHAlK,SAASsM,gBAAgB/D,UAAUgC,OAAO,SAC1CvK,SAASsM,gBAAgB/D,UAAUC,IAAI,MAEnCxI,SAASuM,uBAAuB,aAAazK,OAAQ,CAErD,IAAI8J,EAAO5L,SAASyC,cAAc,uBAElC,GAAImJ,EAAM,CAEND,EAASC,GAaTA,EAAKlE,iBAAiB,SAAS,SAAUiC,G,gBACjC6C,EAAe7C,EAAE8C,WAIrB,GAH2D,QAAtDD,EAA6BnB,QAAQqB,eAAkF,OAAtDF,EAA6BnB,QAAQqB,gBACvGF,EAAgBA,MAAAA,OAAY,EAAZA,EAA8B5J,QAAQ,WAErD4J,MAAAA,OAAY,EAAZA,EAA8BjE,UAAU2B,SAAS,YAAa,CAC/D,IAAIyC,EAAiE,QAAxD,EAAAH,MAAAA,OAAY,EAAZA,EAA8B5J,QAAQ,0BAAkB,eAAEsE,aAAa,iBACpF,GAAa,KAATyF,EAEA,GAAoE,UAA/DH,MAAAA,OAAY,EAAZA,EAA8BtF,aAAa,kBAA6B,CAIzE,IAFA,IAAI0F,EAAkB5M,SAASyC,cAAc,qBAAuBkK,EAAQ,MACxEE,EAAcD,MAAAA,OAAe,EAAfA,EAAiBxG,iBAAiB,gCAC3CvE,EAAI,EAAGiL,EAAMD,MAAAA,OAAW,EAAXA,EAAa/K,OAAQD,GAAKiL,GAAY,GAAIjL,IACzC,MAAfgL,IAAiE,QAA1C,EAAc,QAAd,EAAAA,EAAYhL,UAAE,eAAEe,QAAQ,0BAAkB,eAAEsE,aAAa,mBAAoByF,GACpGV,EAAWY,EAAYhL,GAAmB,OAGlDoK,EAAYO,EAA8B,WAG1CP,EAAYO,EAA8B,WAG7C,CAMD,IAJA,IAAIjK,EAAQiJ,EAAiBgB,MAAAA,OAAY,EAAZA,EAA8BJ,eACvDW,EAAW/M,SAASoG,iBAAiB,wBAErC4G,EAAU,KACEC,GAAPpL,EAAI,EAAUkL,EAASjL,QAAQD,EAAIoL,EAAMpL,IAC1CU,GAASV,IACTmL,EAAUD,EAASlL,IAG3B,GAAmE,SAA9D2K,EAA6BtF,aAAa,iBAA6B,CAExE,IAAIgG,EAAalN,SAASyC,cAAc,+CACxC,GAAmB,OAAfyK,EAAqB,CACrB,IAAIC,EAAkB3B,EAAgB0B,GACtCA,EAAW7F,aAAa,eAAgB,SACN,QAAlC,EAAA6F,EAAWzK,cAAc,iBAAS,SAAE4E,aAAa,gBAAiB,SAElE,IADA,IAAI+F,EAAa,KACDC,GAAPxL,EAAI,EAAUkL,EAASjL,QAAQD,EAAIwL,EAAMxL,IAC1CsL,GAAmBtL,IACnBuL,EAAaL,EAASlL,IAG9BuL,MAAAA,GAAAA,EAAY/F,aAAa,cAAe,SAE3CmF,EAA6BnF,aAAa,gBAAiB,QACjB,QAA1C,EAAAmF,EAA6BJ,qBAAa,SAAE/E,aAAa,eAAgB,QAC1E2F,MAAAA,GAAAA,EAAS3F,aAAa,cAAe,cAMkD,MAAnC,QAAxD,EAACmF,EAA6B5J,QAAQ,0BAAkB,eAAEsE,aAAa,mBACvE6E,EAAUH,MAOtB5L,SAAS0H,iBAAiB,SAAS,SAAUiC,GAEzC,IAAIiB,EAASjB,EAAEiB,OACXgB,GAAQhB,IAAWgB,EAAK1B,SAASU,IACjCmB,EAAUH,MAmBlB,IAFA,IAAI0B,EAAgB1B,EAAKxF,iBAAiB,wBACtC0G,EAAMQ,EAAcxL,OACfD,EAAI,EAAGA,EAAIiL,EAAKjL,IAGrB,IAFA,IAAI0L,EAAuBD,EAAczL,GAAGuE,iBAAiB,KACzDiH,EAAOE,EAAqBzL,OACvB0L,EAAI,EAAGA,EAAIH,EAAMG,IAClBA,EAAI,GAAKH,GACTE,EAAqBC,GAAG9F,iBAAiB,WAAW,SAAUiC,G,QACzC,GAAbA,EAAEe,UACsF,QAAxF,EAA+D,QAA/D,EAAAkB,MAAAA,OAAI,EAAJA,EAAMnJ,cAAc,mDAA2C,eAAEA,cAAc,iBAAS,SAAE2H,YAQ9G,IAAIqD,EAAoB7B,EAAKxF,iBAAiB,4BAC1CsH,EAAiBD,EAAkB3L,OACvC,IAASD,EAAI,EAAGA,EAAI6L,EAAgB7L,IAChC4L,EAAkB5L,GAAG6F,iBAAiB,SAAS,SAAUiC,GACrD,IAAIgE,EAAehE,EAAE8C,WAA2B7J,QAAQ,mBACpDgL,EAAWD,EAAYzG,aAAa,iBAsBxC,GArBI0G,GAAkC,GAAtBC,SAASD,IACrBD,EAAcA,EAAY/K,QAAQ,OACtByE,aAAa,QAAS,SAGlCsG,EAAYtG,aAAa,cAAe,SAG5CsG,EAAYvH,iBAAiB,mBAAmBlG,SAAQ,SAAU8L,GAC9DA,EAAK3E,aAAa,gBAAiB,YAEvCsG,EAAYvH,iBAAiB,0CAA0ClG,SAAQ,SAAU8L,GACrFA,EAAK3E,aAAa,cAAe,YAErCsG,EAAYvH,iBAAiB,kBAAkBlG,SAAQ,SAAU8L,GAC7DA,EAAK3E,aAAa,eAAgB,YAEtCsG,EAAYvH,iBAAiB,WAAWlG,SAAQ,SAAU8L,GACtDA,EAAKzD,UAAUgC,OAAO,aAGtBqD,GAAkC,GAAtBC,SAASD,GAAgB,CAErC,IAAIE,EAAiBH,EAAY/K,QAAQ,oBAAsBiL,SAASD,GAAY,GAAK,MACrFG,EAAuBD,MAAAA,OAAc,EAAdA,EAAgBrL,cAAc,gCAC7B,MAAxBsL,GACAA,EAAqB1G,aAAa,gBAAiB,aAOnE,IAAI2G,EAAahO,SAASyC,cAAc,sBACxCuL,MAAAA,GAAAA,EAAYtG,iBAAiB,SA1MzC,W,QACQuG,EAAW/M,KAAKgG,aAAa,iBAC7BlB,EAAOhG,SAASgG,KACJ,SAAZiI,GACA/M,KAAKmG,aAAa,gBAAiB,QACO,QAA1C,EAAArH,SAASyC,cAAc,2BAAmB,SAAE4E,aAAa,sBAAuB,QAChFrB,EAAKuC,UAAUC,IAAI,eAEnBtH,KAAKmG,aAAa,gBAAiB,SACO,QAA1C,EAAArH,SAASyC,cAAc,2BAAmB,SAAE4E,aAAa,sBAAuB,SAChFrB,EAAKuC,UAAUgC,OAAO,iBAkMlB,IAAI2D,EAAWlO,SAASyC,cAAc,sBAItC,GAHAyL,MAAAA,GAAAA,EAAUxG,iBAAiB,SA9LvC,W,QACQ1B,EAAOhG,SAASgG,KACwB,QAA5C,EAAAhG,SAASyC,cAAc,6BAAqB,SAAE4E,aAAa,gBAAiB,SAClC,QAA1C,EAAArH,SAASyC,cAAc,2BAAmB,SAAE4E,aAAa,sBAAuB,SAChFrB,EAAKuC,UAAUgC,OAAO,gBA4LIvK,SAASyC,cAAc,kBACtBuL,GAAcE,EAAU,CACvC,IAAIC,EAAanO,SAAS+J,eAAe,iBACrCoE,IACAA,EAAWC,MAAMC,IAAM,QAE1BH,EAAyBE,MAAMC,IAAM,QAQ9C,IAAIC,EAAKtO,SAASyC,cAAc,cAC5B8L,EAAIvO,SAASyC,cAAc,qBAC3B+L,GAAQ,EACRC,EAxMZ,SAAsBvC,GAGlB,IAFA,IAAIwC,EAAY,EACZC,EAAazC,EACVyC,GACHD,GAAaC,EAAWD,UACxBC,EAAaA,EAAWC,aAE5B,OAAOF,EAiMcG,CAAaN,GAE9BnN,OAAO0N,SAAW,SAAUnF,GACxB,IAAIoF,EAAS3N,OAAO4N,aAEfR,GAASO,EAASN,GACfF,GAAGA,EAAEhG,UAAUC,IAAI,SACnB8F,GAAIA,EAAG/F,UAAUC,IAAI,SACzBgG,GAAQ,GACDA,GAASO,GAAUN,IACtBF,GAAGA,EAAEhG,UAAUgC,OAAO,SACtB+D,GAAIA,EAAG/F,UAAUgC,OAAO,SAC5BiE,GAAQ,IAMpB,IAAIS,EAAgBjP,SAASoG,iBAAiB,wBAC1C6I,EAAcnN,QACdmN,EAAc/O,SAAQ,SAAUgP,GACvBA,EAAO3G,UAAU2B,SAAS,iBAC3BgF,EAAO3G,UAAUC,IAAI,eACrB0G,EAAOxH,iBAAiB,SAAS,SAAUiC,GACvC,IAAIwF,EAAOxF,EAAEiB,OAC6B,SAAtCuE,EAAKjI,aAAa,iBAClBiI,EAAK9H,aAAa,gBAAiB,QAGnC8H,EAAK9H,aAAa,gBAAiB,gBAUvD,IAAI+H,EAAepP,SAASyC,cAAc,iBACtC4M,EAAqBrP,SAAS+J,eAAe,kBAE7CqF,GACIE,aAAeA,YAAYC,iBAC3BC,MAAMF,YAAYC,iBACbE,MAAK,SAAAC,GAAY,OAAAA,EAASC,UAC1BF,MAAK,SAAU5M,GACRA,GAAQuM,IACRA,EAAa5F,UAAY3G,GAEzBA,GAAQwM,IACRA,EAAmB7F,UAAY3G,MAMnD,IAAI+M,EAAe5P,SAASyC,cAAc,kBAEtCmN,GACIN,aAAeA,YAAYO,iBAC3BL,MAAMF,YAAYO,iBACbJ,MAAK,SAAAC,GAAY,OAAAA,EAASC,UAC1BF,MAAK,SAAU5M,GACZ,GAAIA,GAAQ+M,EAAc,CACtBA,EAAapG,UAAY3G,EACzB,IAAIiN,EAAe9P,SAAS+J,eAAe,gBACvC+F,IACAA,EAAapI,iBAAiB,SAAS,WACnCtG,OAAOC,SAAS0O,KAAOD,EAAc5I,aAAa,eA4B3E,WACH,IAAI8I,EAAYhQ,SAASyC,cAAc,iCAEvC,GAAiB,MAAbuN,EACA,IACI,IAAIjQ,EAAS,cAAgBkQ,oBAAoBC,WACjD,GAAInQ,EAAQ,CACR,IAAIoQ,EAAiBC,KAAKC,MAAMtM,SAAShE,IAEzCiQ,EAAUxG,UAAY2G,EAAeG,mBAGrCN,EAAUxG,UAAY,IAG9B,MAAO+G,GAAO1I,QAAQ2I,IAAID,IAxCNE,QAgD5B,WACI,IAAIC,EAAKC,EAWYlJ,EAVjBmJ,EAAI5Q,SAASuM,uBAAuB,kBACxC,IAAKoE,EAAI,EAAGA,EAAIC,EAAE9O,OAAQ6O,KACtBD,EAAM1Q,SAASsJ,cAAc,QACzBjC,aAAa,UAAYuJ,EAAED,GAAWE,QAAQpJ,IAClDiJ,EAAIlH,WAMa/B,EANYmJ,EAAED,GAAWE,QAAQpJ,QAQ9CqJ,EAAO,2BADC,+DAECxF,QAAQ,KAAM7D,GADhB,4BAPXiJ,EAAIK,QAAUC,EACdJ,EAAED,GAAGlH,YAAYiH,GAUrB,SAASM,EAAaC,GAClB,IAAIrG,EAAUqG,EAAIrG,OAAuBsG,WACzC,GAAItG,EAAQ,CACR,IAAIuG,EAASnR,SAASsJ,cAAc,UAEhC8H,EAAUxG,EAAuB1D,aAAa,WAC9CkK,GAAQD,EAAO9J,aAAa,MAFpB,8CAEiCiE,QAAQ,KAAM8F,IAC3DD,EAAO9J,aAAa,cAAe,KACnC8J,EAAO9J,aAAa,kBAAmB,KACvC,IAAI,EAAUuD,EAAuBwB,cACjC,GAAQ,EAAOiF,aAAaF,EAAQvG,KAKhD,WACI,IASI0G,EAAStR,SAASoG,iBAAiB,iBACvC,IACI,IAAImL,EAAW,IAAIC,sBAAqB,SAAUC,GAE9CA,EAAQvR,SAAQ,SAAUwR,GACtB,GAAIA,EAAMC,eAAgB,CAEtB,IAAIC,EAAUF,EAAM9G,OACpBiH,EAAuBD,GAEvBL,EAASO,UAAUF,SAnBb,CAGlBG,WAAY,OACZC,UAAW,IAsBXV,EAAOpR,SAAQ,SAAU+R,GACrBV,EAASW,QAAQD,MAGzB,MAAO1B,IAIP,SAAqCe,GAGjC,IAAK,IAAIzP,EAAI,EAAGsQ,EAAMb,EAAOxP,OAAQD,EAAIsQ,EAAKtQ,IAC1CgQ,EAAuBP,EAAOzP,IAPlCuQ,CAA4Bd,GAWhC,SAASO,EAAuBD,GAC5BlP,YAAW,WACP,IAAI2P,EAAUT,EAAQ1K,aAAa,YAC/BmL,IACAT,EAAQvK,aAAa,MAAOgL,GAC5BT,EAAQrK,gBAAgB,eAE7B,IAzEX+K,GAnDAC,GAEAvS,SAAS0H,iBAAiB,oBAAoB,WAG1C,IAFA,IAAI8K,EAAoBxS,SAASoG,iBAAiB,+CAC9CqM,EAAY,EACP,EAAI,EAAG,EAAID,EAAkB1Q,OAAQ,IAAK,CAC/C,IAAI4Q,EAAatR,OAAOuR,iBAAiBH,EAAkB,IAAII,iBAAiB,UAC5EC,OAAOH,EAAWpH,QAAQ,KAAK,KAAOmH,IACtCA,EAAYI,OAAOH,EAAWpH,QAAQ,KAAK,MAGnD,IAAIwH,EAAc9S,SAAS+J,eAAe,gBACtC+I,IACAA,EAAY1E,MAAM2E,UAAaN,EAAY,GAAM,W,sBCxX7D,IAAIjC,EAAOwC,kBAEL,SAAUC,GACJpL,SACAA,QAAQ2I,IAAI0C,MAAMC,YAHxB,SAAUF,KAMZnL,EAAOkL,kBAAoBnL,QAAQC,KAAO,aAMxCsL,GALWJ,kBAKG,oBAEhBK,GAAwB,EAOxBC,EACJ,CACIC,OAAQ,YACRC,YAAa,IAGbC,EAA8B,CAAEC,SAAS,GACzCC,EAAwB,KAE5B,SAASC,I,MACDC,EAAuF,IAA5E7T,SAAS+J,eAAeqJ,GAAkC/S,MAAOyB,OACnC,QAA7C,EAAA9B,SAAS+J,eAAe,6BAAqB,SAAE1C,aAAa,WAAYyM,QAAQD,IAGpF,SAASE,IACL,IAAIC,EAAM,IAAIpT,KACVqT,EAA2B,IAAtBD,EAAIE,gBAAyBF,EAAIG,qBAC1C3D,EAAI,CACA,wCAA0CyD,EAAGG,WAAa,OAG9D,IAAIC,EAAYrU,SAAS+J,eAAeqJ,GAAkC/S,MAEtEiU,EAAMhB,EAKV,SAASiB,KAiLb,SAAiCC,GAC7B,IAAIC,EAAcD,EAAoBE,aAEtC,IAAKD,EAAYf,UAAYc,EAAoBG,OAE7C,OADA7M,EAAK,4BACE,EAEX,IAAI8M,EAAM,GACV,GAAIJ,EAAoBG,QAAUH,EAAoBG,OAAOE,MAAO,CAChE,IAAIC,EAAKN,EAAoBG,OAC7BnE,EAAI,CAAC,0BACLoE,EAAI5S,KAAK,CAAE2N,KAAMmF,EAAGD,MAAOF,OAAQG,EAAGrT,MAE1C,IAAIsT,EAAS,GAAIC,EAAU,GAEvBP,EAAYf,UAEZsB,GADAP,EAAcA,EAAYQ,MACJC,aAAaC,KAAI,SAAUzQ,GAAU,MAAO,CAAGiL,KAAMjL,EAAE0Q,IAAKC,MAAO,SAE/EZ,EAAYjB,YACtBuB,EAASN,EAAYa,mBACfb,EAAYa,mBAAmBH,KAAI,SAAUzQ,GAAU,MAAO,CAAGiL,KAAM8E,EAAYc,2BAA4BF,MAAO3Q,EAAE0Q,QACxH,IAEV,IAAII,EAAUZ,EAAIa,OAAOV,EAAQC,GAASU,MAAM,EAAG,IAEnD,GAAuB,IAAnBF,EAAQ1T,OAAgB,OAAO,EAEnC,IAAI6T,EAAU3V,SAAS+J,eAAe,2BAqCtC,OAnCA4L,EAAQnM,UAAY,GAEpBgM,EAAQL,KAAI,SAAUS,GAClB,IAAIlF,EAAM1Q,SAASsJ,cAAc,MAEjCoH,EAAInI,UAAUC,IAAI,wBAElB,IAAIqN,EAAI7V,SAASsJ,cAAc,KAM/B,GAJAuM,EAAE9F,KAAO,IAET8F,EAAExO,aAAa,aAAcuO,EAAEjG,MAE3BiG,EAAEjB,OACFjE,EAAInI,UAAUC,IAAI,wBAClBqN,EAAExO,aAAa,cAAeuO,EAAEjB,QAChCkB,EAAEC,OAAO,aAAeF,EAAEjG,WAI1B,GAFAkG,EAAExO,aAAa,aAAcuO,EAAEP,OAAS,IACxCQ,EAAEC,OAAOF,EAAEjG,MACPiG,EAAEP,MAAO,CACTQ,EAAEC,OAAO,OACT,IAAIC,EAAO/V,SAASsJ,cAAc,QAElCyM,EAAKxN,UAAUC,IAAI,qBACnBuN,EAAKC,YAAcJ,EAAEP,MAErBQ,EAAEC,OAAOC,GAKjB,OAFArF,EAAIoF,OAAOD,GACXF,EAAQG,OAAOpF,GACRA,MAGJ,EAjPCuF,CAAwB,CAAEvB,aAAcjB,EAAwBkB,OAAQhB,IAGxEuC,IAkJZ,SAA0BC,GACtB,IAAIhW,EAAKH,SAAS+J,eAAe,0BAGbsJ,IAChBA,GAAwB,EAExB+C,EADSpW,SAAS+J,eAAe,2BACxB,IAEb,IAAIsM,EAAUrW,SAAS+J,eAAe,0BAClCuM,EAAOtW,SAAS+J,eAAe,2BAG/ByG,EAAI,CAAC,mCAEL+F,EAAKF,GACLD,EAAKjW,GACLiW,EAAKE,GArKDE,GALRlC,EAAId,YAAca,EAClB7D,EAAI,CAAC,gCAAiCJ,KAAKqG,UAAUnC,KAUrD,IAAMoC,EAA8B,IAAIC,QACxCD,EAAeE,IAAI,eAAgB,oBACnCpH,MAAMqH,gBAAiB,CACnBC,OAAQ,OACRC,QAASL,EACT1Q,KAAMoK,KAAKqG,UAAUnC,KAEpB7E,MAAK,SAAAC,GAAY,OAAAA,EAASsH,UAC1BvH,MAAK,SAAU5M,GACZ2N,EAAI,CAAC,sCAAuCJ,KAAKqG,UAAU5T,KAC3D4Q,EAAyB5Q,EACzB0R,OAIR/E,MAAMyH,eAAe3L,QAAQ,QAAS+I,GAAW,CAC7CyC,OAAQ,MACRC,QAASL,IAERjH,MAAK,SAAAC,GAAY,OAAAA,EAASsH,UAC1BvH,MAAK,SAAU5M,GACZ2N,EAAI,CAAC,wBAAyBJ,KAAKqG,UAAU5T,KAC7C8Q,EAAmB9Q,EACnB0R,OAMZ,IAAI2C,EAAqB,WAAcxU,WAAWqR,EA5ExB,MA8E1B,SAASmC,IACD7C,IACA3Q,YAAW,W,MACHvC,EAAKH,SAAS+J,eAAe,0BACjC5J,EAAIiO,MAAO+I,QAAU,OACrBhX,EAAIiO,MAAOgJ,QAAU,IACrBjX,EAAIoI,UAAUgC,OAAO,gBACiB,QAAtC,EAAAvK,SAAS+J,eAAe,sBAAc,SAAExB,UAAUgC,OAAO,UApF/C,KAuFd8I,GAAwB,GAIhC,SAASgE,EAA0B1N,GAC/BA,EAAEM,iBACFiM,IACA1F,EAAI,CAAC,8BACL8G,EAAyB3N,EAAEiB,OAAOhI,QAAQ,OAG9C,SAAS2U,EAAgB5N,GACrB,IAAIjF,EAAc,cAAViF,EAAEvJ,KAAiC,SAAVuJ,EAAEvJ,IAC/BoX,EAAc,YAAV7N,EAAEvJ,KAA+B,OAAVuJ,EAAEvJ,IAC7BqX,EAAc,cAAV9N,EAAEvJ,KAAiC,SAAVuJ,EAAEvJ,IAC/BwV,EAAc,eAAVjM,EAAEvJ,KAAkC,UAAVuJ,EAAEvJ,IACpC,GAAIiT,EACA,GAAI3O,GAAK8S,EAAG,CACR7N,EAAEM,iBAMF,IAJA,IAAIyN,EAAW1X,SAAS+J,eAAe,2BAA4B1D,SAE/DsR,EAAU3X,SAAS+J,eAAe,2BAA4BwC,uBAAuB,YAAY,GAE5F1K,EAAI,EAAGA,EAAI6V,EAAS5V,OAAQD,IACtB6V,EAAS7V,GAEf0G,UAAUgC,OAAO,YAG1B,GAAI7F,EAAG,CACH,IAAIiM,EAAIgH,MAAAA,OAAO,EAAPA,EAAStL,mBACR,MAALsE,IACAA,EAAI+G,EAAS,IAEjB/G,EAAGpI,UAAUC,IAAI,gBACd,CACH,IAAIoP,EAAID,MAAAA,OAAO,EAAPA,EAASjM,uBACR,MAALkM,IACAA,EAAIF,EAASA,EAAS5V,OAAS,IAEnC8V,EAAGrP,UAAUC,IAAI,iBAEJ,WAAVmB,EAAEvJ,KAA8B,QAAVuJ,EAAEvJ,KAC/BuJ,EAAEM,iBACFiM,KACSuB,GAAK7B,GAAgB,UAAVjM,EAAEvJ,KACtB8W,QAOM,UAAVvN,EAAEvJ,KAAqBsE,GAAK8S,GAAKC,GAAK7B,GACtCsB,IAIR,SAASW,EAAiBlO,GAEtB,GADA6G,EAAI,CAAC,qBAAuB7G,EAAEvJ,MAChB,UAAVuJ,EAAEvJ,KACEiT,EAAuB,CACvB,IAAIyE,EAAM9X,SAAS+J,eAAe,2BAA4BwC,uBAAuB,YAErF,OADA2J,IACI4B,EAAIhW,OAAS,GACb6H,EAAEM,sBACFqN,EAAyBQ,EAAI,UAKjC,EAGRZ,IAGJ,SAASd,EAAKjW,EAAiB4X,G,WAAA,IAAAA,IAAAA,GAAA,GAC3B5X,EAAIoI,UAAUC,IAAI,gBACduP,EACArV,YAAW,W,MACPvC,EAAIiO,MAAO+I,QAAU,QACrBhX,EAAIiO,MAAOgJ,QAAU,IACiB,QAAtC,EAAApX,SAAS+J,eAAe,sBAAc,SAAExB,UAAUC,IAAI,UA3K5C,MA8KdrI,EAAIiO,MAAO+I,QAAU,QACrBhX,EAAIiO,MAAOgJ,QAAU,IACiB,QAAtC,EAAApX,SAAS+J,eAAe,sBAAc,SAAExB,UAAUC,IAAI,SAI9D,SAAS+N,EAAKpW,EAAiB4X,QAAA,IAAAA,IAAAA,GAAA,GAC3BrV,YAAW,WACPvC,EAAIiO,MAAO+I,QAAU,OACrBhX,EAAIiO,MAAOgJ,QAAU,IACrBjX,EAAIoI,UAAUgC,OAAO,kBAxLP,KA2RtB,SAAS+M,EAAyBU,GAC9B,IAAIC,EAASD,EAAI9R,qBAAqB,KAAM8F,KAAK,GAC7C2I,EAASsD,EAAQ/Q,aAAa,eAClC,GAAIyN,EACA3U,SAASqB,SAAWsT,MADxB,CAKA9M,QAAQ2I,IAAIyH,GAEZ,IAAItI,EAAOsI,EAAQ/Q,aAAa,cAC5BmO,EAAQ4C,EAAQ/Q,aAAa,cAChClH,SAAS+J,eAAeqJ,GAAkC/S,MAAQsP,MAAAA,EAAAA,EAAQ,GAC1E3P,SAAS+J,eAAe,4BAAiD1J,MAAQgV,MAAAA,EAAAA,EAAS,GAEzDrV,SAAS+J,eAAe,oBAC/CmO,UAwBflY,SAAS0H,iBAAiB,oBAAoB,SAAUyQ,IArBxD,WACI3H,EAAI,CAAC,sBACL,IAAI4H,EAAQpY,SAAS+J,eAAeqJ,GAChCgF,IACAA,EAAMC,UAAYd,EAClBa,EAAME,WAAaT,EACnBO,EAAMG,SAAW3E,EAEjBA,IAEA5T,SAAS+J,eAAe,2BAA4BgH,QAAUsG,EAE9DrX,SAASgG,KAAK+K,QAAU,SAAUpH,GAC9BuM,KAEJlW,SAAS+J,eAAe,eAAgBgH,QAAU,SAAUpH,GACvD3J,SAAS+J,eAAeqJ,GAAkC/S,MAAQ,KAM3EmY,O,sBCpVH,IAAIC,EAAWzY,SAASuM,uBAAuB,gBAC5CmM,EAAmB1Y,SAASuM,uBAAuB,cAAcP,KAAK,GA8B1E,SAAS2M,EAAcxY,GAenB,MAbA,CACI,KAAQA,EAAG+G,aAAa,aACxB,GAAM/G,EAAG+G,aAAa,2BACf/G,EAAG+G,aAAa,oBAChB/G,EAAG+G,aAAa,WACvB,WAAc/G,EAAG+G,aAAa,oBAAsB/G,EAAG+G,aAAa,WACpE,MAAS/G,EAAG+G,aAAa,cACzB,MAAS/G,EAAG+G,aAAa,cACzB,SAAY/G,EAAG+G,aAAa,iBAC5B,SAAY/G,EAAG+G,aAAa,iBAC5B,KAAQ/G,EAAG+G,aAAa,cAmDhC,SAAS0R,EAAejP,GACpBA,EAAEM,iBAEF,IA2DsB4O,EAAYC,EA3D9B3Y,EAAKwJ,EAAEoP,cA2DWF,EA1DLF,EAAcxY,GA0DG2Y,EAzDjB3Y,EAAG+G,aAAa,QA0DjC8R,UAAUhX,KAAK,CAAEiX,UAAW,OAC5BD,UAAUhX,KAAK,CACX,MAAS,mBACT,UAAa,CACT,MAAS,CACL,SAAY,CAAC6W,OAKrBC,IACA9Y,SAASqB,SAAWyX,GAjD5B,SAASI,EAAcvP,GAGnB,IAmBkBwP,EArBlBxP,EAAEM,iBAqBgBkP,EAlBCC,EADVzP,EAAEoP,eAoBXC,UAAUhX,KAAK,CAAEiX,UAAW,OAC5BD,UAAUhX,KAAK,CACX,MAAS,iBACT,UAAa,CACT,WAAc,CACV,WAAc,CAACmX,OAK3BnZ,SAASqB,SAAW8X,EAASE,eAxBjC,SAASD,EAAgBjZ,GAUrB,MARA,CACI,GAAMA,EAAG+G,aAAa,WACtB,KAAQ/G,EAAG+G,aAAa,aACxB,SAAY/G,EAAG+G,aAAa,iBAC5B,SAAY/G,EAAG+G,aAAa,iBAC5B,eAAkB/G,EAAG+G,aAAa,SAkL1C9F,OAAOkY,OAAS,WAxQhB,IAlC6BnZ,EAmCrBoZ,EACAC,EACAC,EAEAC,EAJAH,EAgCR,WAGI,IAFA,IAAIA,EAAW,GAEN1X,EAAI,EAAGA,EAAI4W,EAAS3W,OAAQD,IACjC4W,EAAS5W,GAAG6F,iBAAiB,QAASkR,GAEtCW,EAASvX,KAAK2W,EAAcF,EAAS5W,KAGzC,OAAO0X,EAzCQI,GACXH,EAqDR,WACI,IAAII,EAAU5Z,SAASyC,cAAc,iBACjCoX,EAAgB,GAEpB,GAAID,EACA,IAAK,IAAI/X,EAAI,EAAGA,EAAI+X,EAAQ9X,OAAQD,IAChC+X,EAAQ/X,GAAG6F,iBAAiB,QAASwR,GAErCW,EAAc7X,KAAKoX,EAAgBQ,EAAQ/X,KAInD,OAAOgY,EAjEUC,GACbL,EA5CAf,EASJ,CACI,MAHqBvY,EANMuY,GAShBxR,aAAa,aACxB,GAAM/G,EAAG+G,aAAa,2BACf/G,EAAG+G,aAAa,oBAChB/G,EAAG+G,aAAa,WACvB,WAAc/G,EAAG+G,aAAa,oBAAsB/G,EAAG+G,aAAa,WACpE,MAAS/G,EAAG+G,aAAa,cACzB,MAAS/G,EAAG+G,aAAa,cACzB,SAAY/G,EAAG+G,aAAa,kBAbzB,KA0CHwS,EAAe,CACfT,UAAW,CACPc,aAAc,QAIlBR,EAASzX,OAAS,IAClB4X,EAAaT,UAAUe,IAAM,CACzBC,eAAgB,CAAEV,SAAAA,KAItBC,EAAW1X,OAAS,IACpB4X,EAAaT,UAAUe,IAAIE,UAAY,CACnCA,UAAW,CAAEV,WAAYA,KAIX,MAAlBC,IACAC,EAAaT,UAAUe,IAAM,CACzBG,OAAQ,CAAEZ,SAAU,CAACE,MAI7BT,UAAUhX,KAAK,CAAEiX,UAAW,OAC5BD,UAAUhX,KAAK0X,K","sources":["webpack://gak.frontend/./ReskinScripts/utils.ts","webpack://gak.frontend/webpack/bootstrap","webpack://gak.frontend/webpack/runtime/define property getters","webpack://gak.frontend/webpack/runtime/hasOwnProperty shorthand","webpack://gak.frontend/./ReskinScripts/aria.modal.js","webpack://gak.frontend/./ReskinScripts/common.ts","webpack://gak.frontend/./ReskinScripts/NewSearchAutoComplete.ts","webpack://gak.frontend/./ReskinScripts/enhanced-ecommerce.js"],"sourcesContent":["declare var ImagesParams: {\r\n UseCDNImageCache: boolean,\r\n CloudflareAccountHash: string\r\n};\r\n\r\nexport default class Utils {\r\n static deleteCookie = (name: string) => {\r\n document.cookie = name + \"=; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;\";\r\n };\r\n\r\n static getCookie(cookieName: string) {\r\n let cookie: any = {};\r\n document.cookie.split(';').forEach(function (el) {\r\n let [key, value] = el.split('=');\r\n cookie[key.trim()] = value;\r\n })\r\n\r\n return cookie[cookieName];\r\n }\r\n\r\n static setCookie(name: string, value: any, days: number) {\r\n var expires = \"\";\r\n if (days) {\r\n var date = new Date();\r\n date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));\r\n expires = \"; expires=\" + date.toUTCString();\r\n }\r\n else {\r\n expires = \"; expires=Session\";\r\n }\r\n document.cookie = name + \"=\" + (value || \"\") + expires + \"; path=/\";\r\n }\r\n\r\n static setSessionCookie(name: string, value: any) {\r\n var expires = \"\";\r\n expires = \"; expires=Session\";\r\n document.cookie = name + \"=\" + (value || \"\") + expires + \"; path=/\";\r\n }\r\n\r\n\r\n static getHashKeyValuePairs() {\r\n return this.getUrlKeyValuePairs(window.location.hash);\r\n }\r\n\r\n static getHrefKeyValuePairs() {\r\n return this.getUrlKeyValuePairs(window.location.search);\r\n }\r\n\r\n static getUrlKeyValuePairs(url: string) {\r\n var result = [];\r\n\r\n if (url) {\r\n var hash = url.substring(1); //removes the # or ? character for hash or queryString repectively.\r\n var pairs = hash.split('&');\r\n for (var i = 0; i < pairs.length; i++) {\r\n var pairParts = pairs[i].split('=');\r\n if (pairParts.length == 2) {\r\n var key = pairParts[0];\r\n var value = pairParts[1];\r\n result.push({ key: key, value: value });\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n static loadImagesForProductListings_BasedOnView(prodListing: any) {\r\n var isGridView = prodListing.hasClass('view-as-grid');\r\n prodListing.find('.productImageWrapper img').each(function (index: any) {\r\n var img = document.querySelector(index);\r\n setTimeout(function () {\r\n var newImgUrl = img.closest('.innerwrapper').data(isGridView ? 'prodimggridview' : 'prodimglistview');\r\n // Set the new Img Url to the proper attribute src or lazy-src.\r\n if (img.attr(\"lazy-src\")) {\r\n img.attr(\"lazy-src\", newImgUrl);\r\n }\r\n else if (img[0].src) {\r\n img[0].src = newImgUrl;\r\n }\r\n }, 1);\r\n });\r\n }\r\n\r\n static getImageURL(width: number, height: number, imgUrl: string): string {\r\n if (ImagesParams.UseCDNImageCache) {\r\n if (imgUrl.startsWith('~')) {\r\n imgUrl = imgUrl.substring(1);\r\n }\r\n return `https://www.gak.co.uk/cdn-cgi/image/fit=scale-down,width=${width},height=${height},format=auto/${imgUrl}`;\r\n }\r\n else {\r\n return `https://www.gak.co.uk/cdn-cgi/imagedelivery/${ImagesParams.CloudflareAccountHash}/${imgUrl}/${width}x${height}`;\r\n }\r\n \r\n }\r\n\r\n static atou(b64: string) {\r\n return decodeURIComponent(escape(atob(b64)));\r\n }\r\n\r\n static utoa(data: any) {\r\n return btoa(unescape(encodeURIComponent(data)));\r\n }\r\n}","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","(function ( w, doc, undefined ) {\r\n\t'use strict';\r\n\r\n\t/**\r\n\t * Local object for method references,\r\n\t * define script metadata, and other\r\n\t * global variables.\r\n\t */\r\n\tvar ARIAmodal = {};\r\n\tw.ARIAmodal = ARIAmodal;\r\n\r\n\tARIAmodal.NS = 'ARIAmodal';\r\n\tARIAmodal.AUTHOR = 'Scott O\\'Hara';\r\n\tARIAmodal.VERSION = '3.4.0';\r\n\tARIAmodal.LICENSE = 'https://github.com/scottaohara/accessible_modal_window/blob/master/LICENSE';\r\n\r\n\tvar activeClass = 'modal-open';\r\n\tvar body = doc.body;\r\n\tvar main = doc.getElementsByTagName('main')[0] || body;\r\n\r\n\tvar modal = doc.querySelectorAll('[data-modal]');\r\n\tvar children = doc.querySelectorAll('body > *:not([data-modal])');\r\n\r\n\tvar initialTrigger;\r\n\tvar activeModal;\r\n\tvar useAriaModal = false;\r\n\tvar returnToBody = false;\r\n\r\n\tvar firstClass = 'js-first-focus';\r\n\tvar lastClass = 'js-last-focus';\r\n\r\n\tvar tabFocusElements = 'button:not([hidden]):not([disabled]), [href]:not([hidden]), input:not([hidden]):not([type=\"hidden\"]):not([disabled]), select:not([hidden]):not([disabled]), textarea:not([hidden]):not([disabled]), [tabindex=\"0\"]:not([hidden]):not([disabled]), summary:not([hidden]), [contenteditable]:not([hidden]), audio[controls]:not([hidden]), video[controls]:not([hidden])';\r\n\r\n\r\n\t/**\r\n\t * Function to place the modal dialog(s) as the first child(ren)\r\n\t * of the body element, so tabbing backwards will move focus\r\n\t * into the browser's chrome.\r\n\t */\r\n\tARIAmodal.organizeDOM = function () {\r\n\t\tmodal = doc.querySelectorAll('[data-modal]');\r\n\t\tvar refEl = body.firstElementChild || null;\r\n\t\tvar i;\r\n\r\n\t\tfor (i = 0; i < modal.length; i++) {\r\n\t\t\tbody.insertBefore( modal[i], refEl );\r\n\t\t}\r\n\t};\r\n\r\n\r\n\t/**\r\n\t * Global Create\r\n\t *\r\n\t * This function validates that the minimum required markup\r\n\t * is present to create the ARIA widget(s).\r\n\t *\r\n\t * Any additional markup elements or attributes that\r\n\t * do not exist in the found required markup patterns\r\n\t * will be generated setup functions.\r\n\t */\r\n\tARIAmodal.setupTrigger = function () {\r\n\t\tvar trigger = doc.querySelectorAll('[data-modal-open]');\r\n\t\tvar self;\r\n\t\tvar i;\r\n\r\n\t\tfor ( i = 0; i < trigger.length; i++ ) {\r\n\t\t\tself = trigger[i];\r\n\r\n\t\t\tvar getOpenTarget = self.getAttribute('data-modal-open');\r\n\t\t\tvar hasHref = self.getAttribute('href');\r\n\r\n\t\t\t/**\r\n\t\t\t * If not a button, update the semantics to make the element\r\n\t\t\t * announce as a button and provide it a tabindex=0 to\r\n\t\t\t * ensure it is keyboard focusable.\r\n\t\t\t */\r\n\t\t\tif ( self.nodeName !== 'BUTTON' ) {\r\n\t\t\t\tself.setAttribute('role', 'button');\r\n\t\t\t\tself.tabIndex = 0;\r\n\t\t\t}\r\n\r\n\t\t\t/**\r\n\t\t\t * If getOpenTarget was the empty string, but there is an\r\n\t\t\t * href attribute, then get the possible target from the href\r\n\t\t\t */\r\n\t\t\tif ( getOpenTarget === '' && hasHref ) {\r\n\t\t\t\tself.setAttribute('data-modal-open', hasHref.split('#')[1] );\r\n\t\t\t\tgetOpenTarget = hasHref.split('#')[1];\r\n\t\t\t}\r\n\r\n\t\t\t/**\r\n\t\t\t * If an was changed to a role=button, then the context\r\n\t\t\t * menu of the 'button' should no longer act as if it's for a link.\r\n\t\t\t * Removing the href attribute will negate the link context menu\r\n\t\t\t * if a user performs a right-click.\r\n\t\t\t */\r\n\t\t\tself.removeAttribute('href');\r\n\r\n\t\t\t/**\r\n\t\t\t * Check for if a data-modal-open attribute is on\r\n\t\t\t * a button. If not, then the button targets nothing\r\n\t\t\t * and there's not much that can be done with that.\r\n\t\t\t */\r\n\t\t\tif ( getOpenTarget ) {\r\n\t\t\t\t/**\r\n\t\t\t\t * A button should have an aria-haspopup=\"dialog\" to convey to users that\r\n\t\t\t\t * *this* button will launch a modal dialog.\r\n\t\t\t\t *\r\n\t\t\t\t * Presently, the \"dialog\" value is not fully supported and in unsupported\r\n\t\t\t\t * instances, it defaults back to announcing that a \"menu\" will open.\r\n\t\t\t\t * Use this attribute with caution until this value has wider support.\r\n\t\t\t\t */\r\n\t\t\t\t// self.setAttribute('aria-haspopup', 'dialog');\r\n\r\n\t\t\t\t/**\r\n\t\t\t\t * Remove the disabled attribute, as if this script is running, JavaScript\r\n\t\t\t\t * must be enabled and thus the button should function.\r\n\t\t\t\t *\r\n\t\t\t\t * But wait...there may be value in having a disabled button that can be\r\n\t\t\t\t * enabled via other user actions. So, in that scenario look for a\r\n\t\t\t\t * data-modal-disabled attribute, to keep the button disabled.\r\n\t\t\t\t */\r\n\t\t\t\tif ( self.hasAttribute('disabled') && !self.hasAttribute('data-modal-disabled') ) {\r\n\t\t\t\t\tself.removeAttribute('disabled');\r\n\t\t\t\t}\r\n\r\n\t\t\t\t/**\r\n\t\t\t\t * In instances when JavaScript is unavailable and a disabled\r\n\t\t\t\t * button is not desired, a hidden attribute can be used to\r\n\t\t\t\t * completely hide the button.\r\n\t\t\t\t *\r\n\t\t\t\t * Remove this hidden attribute to reveal the button.\r\n\t\t\t\t */\r\n\t\t\t\tself.removeAttribute('hidden');\r\n\r\n\t\t\t\t/**\r\n\t\t\t\t * Get modal target and supply the button with a unique ID to easily\r\n\t\t\t\t * reference for returning focus to, once the modal dialog is closed.\r\n\t\t\t\t */\r\n\t\t\t\tself.id = getOpenTarget + '__trigger-' + self.nodeName + '-' + i;\r\n\r\n\t\t\t\t/**\r\n\t\t\t\t * Events\r\n\t\t\t\t */\r\n\t\t\t\tself.addEventListener('click', ARIAmodal.openModal);\r\n\t\t\t\tself.addEventListener('keydown', ARIAmodal.keyEvents, false);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tconsole.warn('Missing target modal dialog - [data-modal-open=\"IDREF\"]');\r\n\t\t\t}\r\n\t\t} // for(widget.length)\r\n\t}; // ARIAmodal.setupTrigger()\r\n\r\n\r\n\t/**\r\n\t * Setup the necessary attributes and child elements for the\r\n\t * modal dialogs.\r\n\t */\r\n\tARIAmodal.setupModal = function () {\r\n\t\tvar self;\r\n\t\tvar i;\r\n\t\tmodal = doc.querySelectorAll('[data-modal]');\r\n\t\tfor ( i = 0; i < modal.length; i++ ) {\r\n\t\t\tself = modal[i];\r\n\t\t\tvar modalType = self.getAttribute('data-modal');\r\n\t\t\tvar getClass = self.getAttribute('data-modal-class') || 'a11y-modal';\r\n\t\t\tvar heading = self.querySelector('h1, h2, h3, h4, h5, h6');\r\n\t\t\tvar modalLabel = self.getAttribute('data-modal-label');\r\n\t\t\tvar hideHeading = self.hasAttribute('data-modal-hide-heading');\r\n\t\t\tvar modalDesc = self.querySelector('[data-modal-description]');\r\n\t\t\tvar modalDoc = self.querySelector('[data-modal-document]');\r\n\r\n\t\t\t/**\r\n\t\t\t * Check to see if this is meant to be an alert or normal dialog.\r\n\t\t\t * Supply the appropriate role.\r\n\t\t\t */\r\n\t\t\tif ( modalType === 'alert' ) {\r\n\t\t\t\tself.setAttribute('role', 'alertdialog');\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tself.setAttribute('role', 'dialog');\r\n\t\t\t}\r\n\r\n\t\t\t/**\r\n\t\t\t * Set either the default dialog class or a class passed\r\n\t\t\t * in from the data-modal-class attribute.\r\n\t\t\t */\r\n\t\t\tself.classList.add(getClass);\r\n\r\n\t\t\t/**\r\n\t\t\t * Modal dialogs need to be hidden by default.\r\n\t\t\t *\r\n\t\t\t * To ensure they stay hidden, even if CSS is disabled, or purposefully\r\n\t\t\t * turned off, apply a [hidden] attribute to the dialogs.\r\n\t\t\t */\r\n\t\t\tself.hidden = true;\r\n\r\n\t\t\t/**\r\n\t\t\t * When a modal dialog is opened, the dialog itself\r\n\t\t\t * should be focused. Set a tabindex=\"-1\" to allow this\r\n\t\t\t * while keeping the container out of the focus order.\r\n\t\t\t */\r\n\t\t\tself.tabIndex = '-1';\r\n\r\n\r\n\t\t\t/**\r\n\t\t\t * Older versions of NVDA used to automatically turn on forms mode\r\n\t\t\t * when a user entered a modal dialog. A role=\"document\", surrounding\r\n\t\t\t * the content of the dialog would allow non-form dialogs to be\r\n\t\t\t * navigated correctly by the virtual cursor.\r\n\t\t\t *\r\n\t\t\t * If a dialog needs to be compatible with older NVDA, look for\r\n\t\t\t * a data-modal-document, and give that a role=document.\r\n\t\t\t */\r\n\t\t\tif ( modalDoc ) {\r\n\t\t\t\tmodalDoc.setAttribute('role', 'document');\r\n\t\t\t}\r\n\r\n\r\n\t\t\t/**\r\n\t\t\t * Modal dialogs need at least one actionable item\r\n\t\t\t * to close them...\r\n\t\t\t */\r\n\t\t\tARIAmodal.setupModalCloseBtn(self, getClass, modalType);\r\n\r\n\t\t\t/**\r\n\t\t\t * The aria-modal attribute currently makes it difficult to navigate\r\n\t\t\t * through the contents of a modal dialog with VoiceOver.\r\n\t\t\t *\r\n\t\t\t * Up/down arrows do not have access to all content, and\r\n\t\t\t * using VO + left/right also do not have access to all\r\n\t\t\t * content, but do have access to different content then\r\n\t\t\t * up/down arrows alone.\r\n\t\t\t *\r\n\t\t\t * Note: The VoiceOver issues should be fixed with the release\r\n\t\t\t * of Safari 12.\r\n\t\t\t *\r\n\t\t\t * Additionally, NVDA will mostly respect the aria-modal attribute\r\n\t\t\t * with one notable bug, where if a user navigates to the address\r\n\t\t\t * bar via NVDA key + F6, a user can re-enter document that is obscured\r\n\t\t\t * by the open dialog, and can navigate the content 'beneath' the\r\n\t\t\t * dialog with arrow keys, or quick keys.\r\n\t\t\t *\r\n\t\t\t * Using the tab key inconsistently returns a user to the modal\r\n\t\t\t * dialog's contents, or may produce no keyboard focus change.\r\n\t\t\t *\r\n\t\t\t * This attribute can be added to a particular dialog if the\r\n\t\t\t * dialog has a data-aria-modal attribute set.\r\n\t\t\t */\r\n\t\t\tif ( self.hasAttribute('data-aria-modal') ) {\r\n\t\t\t\tself.setAttribute('aria-modal', 'true');\r\n\t\t\t}\r\n\r\n\r\n\t\t\t/**\r\n\t\t\t * Do a check to see if there is an element flagged to be the\r\n\t\t\t * description of the modal dialog.\r\n\t\t\t */\r\n\t\t\tif ( modalDesc ) {\r\n\t\t\t\tmodalDesc.id = modalDesc.id || 'md_desc_' + Math.floor(Math.random() * 999) + 1;\r\n\t\t\t\tself.setAttribute('aria-describedby', modalDesc.id);\r\n\t\t\t}\r\n\r\n\t\t\t/**\r\n\t\t\t * Check for a heading to set the accessible name of the dialog,\r\n\t\t\t * or if an aria-label should be set to the dialog instead.\r\n\t\t\t */\r\n\t\t\tif ( modalLabel ) {\r\n\t\t\t\tself.setAttribute('aria-label', modalLabel);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tif ( heading ) {\r\n\t\t\t\t\tvar makeHeading = self.id + '_heading';\r\n\t\t\t\t\theading.classList.add(getClass + '__heading');\r\n\t\t\t\t\theading.id = makeHeading;\r\n\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * Set an aria-labelledby to the modal dialog container.\r\n\t\t\t\t\t */\r\n\t\t\t\t\tself.setAttribute('aria-labelledby', makeHeading);\r\n\r\n\t\t\t\t\tif ( heading.hasAttribute('data-autofocus') ) {\r\n\t\t\t\t\t\theading.tabIndex = '-1';\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tconsole.warn('Dialogs should have their purpose conveyed by a heading element (h1).');\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t/**\r\n\t\t\t * If a dialog has a data-modal-hide-heading attribute, then that means this\r\n\t\t\t * dialog's heading should be visually hidden.\r\n\t\t\t */\r\n\t\t\tif ( hideHeading ) {\r\n\t\t\t\tself.querySelector('#' + heading.id).classList.add('at-only');\r\n\t\t\t}\r\n\r\n\t\t\t/**\r\n\t\t\t * Get all focusable elements from within a dialog and set the\r\n\t\t\t * first and last elements to have respective classes for later looping.\r\n\t\t\t */\r\n\t\t\tvar focusable = self.querySelectorAll(tabFocusElements);\r\n\t\t\tfocusable[0].classList.add(firstClass);\r\n\t\t\tfocusable[focusable.length - 1].classList.add(lastClass);\r\n\t\t}\r\n\t}; // ARIAmodal.setupModal\r\n\r\n\r\n\t/**\r\n\t * Setup any necessary close buttons, and add appropriate\r\n\t * listeners so that they will close their parent modal dialog.\r\n\t */\r\n\tARIAmodal.setupModalCloseBtn = function ( self, modalClass, modalType ) {\r\n\t\tvar doNotGenerate = self.hasAttribute('data-modal-manual-close');\r\n\t\tvar manualClose = self.querySelectorAll('[data-modal-close-btn]');\r\n\t\tvar modalClose = self.getAttribute('data-modal-close');\r\n\t\tvar modalCloseClass = self.getAttribute('data-modal-close-class');\r\n\t\tvar closeIcon = '';\r\n\t\tvar btnClass = modalClass;\r\n\t\tvar i;\r\n\r\n\t\tif ( !doNotGenerate ) {\r\n\t\t\tif ( manualClose.length < 2 ) {\r\n\t\t\t\tvar closeBtn = doc.createElement('button');\r\n\t\t\t\tcloseBtn.type = 'button';\r\n\r\n\t\t\t\t/**\r\n\t\t\t\t * If a custom class is set, set that class\r\n\t\t\t\t * and create BEM classes for direct child elements.\r\n\t\t\t\t *\r\n\t\t\t\t * If no custom class set, then use default \"a11y-modal\" class.\r\n\t\t\t\t */\r\n\t\t\t\tself.classList.add(modalClass);\r\n\t\t\t\tcloseBtn.classList.add(modalClass + '__close-btn');\r\n\r\n\t\t\t\t/**\r\n\t\t\t\t * If there is no data-modal-close attribute, or it has no set value,\r\n\t\t\t\t * then inject the close button icon and text into the generated button.\r\n\t\t\t\t *\r\n\t\t\t\t * If the data-modal-close attribute has a set value, then use that as the\r\n\t\t\t\t * visible text of the close button, and do not position it in the upper right\r\n\t\t\t\t * of the modal dialog.\r\n\t\t\t\t */\r\n\t\t\t\tif ( !modalClose && modalType !== 'alert' ) {\r\n\t\t\t\t\tcloseBtn.innerHTML = closeIcon;\r\n\t\t\t\t\tcloseBtn.setAttribute('aria-label', 'Close');\r\n\t\t\t\t\tcloseBtn.classList.add('is-icon-btn');\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tcloseBtn.innerHTML = modalClose;\r\n\r\n\t\t\t\t\tif ( modalCloseClass ) {\r\n\t\t\t\t\t\tcloseBtn.classList.add(modalCloseClass);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( modalType !== 'alert' ) {\r\n\t\t\t\t\tif ( self.querySelector('[role=\"document\"]') ) {\r\n\t\t\t\t\t\tself.querySelector('[role=\"document\"]').appendChild(closeBtn);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tself.appendChild(closeBtn);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tcloseBtn.addEventListener('click', ARIAmodal.closeModal);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tfor ( i = 0; i < manualClose.length; i++ ) {\r\n\t\t\tmanualClose[i].addEventListener('click', ARIAmodal.closeModal);\r\n\t\t}\r\n\r\n\t\tdoc.addEventListener('keydown', ARIAmodal.keyEvents, false);\r\n\t}; // ARIAmodal.setupModalCloseBtn\r\n\r\n\r\n\t/**\r\n\t * Actions\r\n\t */\r\n\tARIAmodal.openModal = function ( e, autoOpen ) {\r\n\t\tvar i;\r\n\t\tvar getTargetModal = autoOpen || this.getAttribute('data-modal-open');\r\n\t\t// Update the activeModal\r\n\t\tactiveModal = doc.getElementById(getTargetModal);\r\n\r\n\t\tvar focusTarget = activeModal; // default to the modal dialog container\r\n\t\tvar getAutofocus = activeModal.querySelector('[autofocus]') || activeModal.querySelector('[data-autofocus]');\r\n\r\n\t\tuseAriaModal = activeModal.hasAttribute('aria-modal');\r\n\r\n\t\t/**\r\n\t\t * If a modal dialog was auto-opened, then a user should\r\n\t\t * be returned to the top of the document when the modal\r\n\t\t * is closed, so that they do not have to figure out where\r\n\t\t * they've been placed in the DOM\r\n\t\t */\r\n\t\tif ( autoOpen ) {\r\n\t\t\treturnToBody = true;\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * If a modal was auto-opened on page load, then the\r\n\t\t * following do not apply.\r\n\t\t */\r\n\t\tif ( !autoOpen ) {\r\n\t\t\t/**\r\n\t\t\t * In case these are links, negate default behavior and just\r\n\t\t\t * do what this script tells these triggers to do.\r\n\t\t\t */\r\n\t\t\te.preventDefault();\r\n\r\n\t\t\t/**\r\n\t\t\t * Keep track of the trigger that opened the initial dialog.\r\n\t\t\t */\r\n\t\t\tinitialTrigger = this.id;\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * If a modal dialog contains an that is meant to be autofocused,\r\n\t\t * then focus should be placed on that element (likely form control),\r\n\t\t * instead of the wrapping dialog container.\r\n\t\t *\r\n\t\t * If a dialog has an attribute indicating the close button should\r\n\t\t * be autofocused, focus the first close button found.\r\n\t\t */\r\n\t\tif ( getAutofocus ) {\r\n\t\t\tfocusTarget = getAutofocus;\r\n\t\t}\r\n\t\telse if ( activeModal.hasAttribute('data-modal-close-focus') ) {\r\n\t\t\tfocusTarget = activeModal.querySelector('[class*=\"close-btn\"]');\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * Do a check to see if a modal is already open.\r\n\t\t * If not, then add a class to the body as a check\r\n\t\t * for other functions and set contents other than\r\n\t\t * the opened dialog to be hidden from screen readers\r\n\t\t * and to not accept tab focus, nor for their child elements.\r\n\t\t */\r\n\t\tif ( !body.classList.contains(activeClass) ) {\r\n\t\t\tbody.classList.add(activeClass);\r\n\r\n\t\t\tfor ( i = 0; i < children.length; i++ ) {\r\n\t\t\t\tif ( !useAriaModal ) {\r\n\t\t\t\t\tif ( children[i].hasAttribute('aria-hidden') ) {\r\n\t\t\t\t\t\tchildren[i].setAttribute('data-keep-hidden', children[i].getAttribute('aria-hidden') );\r\n\t\t\t\t\t}\r\n\t\t\t\t\tchildren[i].setAttribute('aria-hidden', 'true');\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( children[i].getAttribute('inert') ) {\r\n\t\t\t\t\tchildren[i].setAttribute('data-keep-inert', '');\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tchildren[i].setAttribute('inert', 'true');\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\telse {\r\n\t\t\tconsole.warn('It is not advised to open dialogs from within other dialogs. Instead consider replacing the contents of this dialog with new content. Or providing a stepped, or tabbed interface within this dialog.');\r\n\t\t}\r\n\r\n\t\tactiveModal.removeAttribute('hidden');\r\n\r\n\t\t// Mostly reliable fix for iOS issue where VO focus is not moved\r\n\t\t// to the dialog on open. Credit to Thomas Jaggi - codepen.io/backflip\r\n\t\t// for the fix.\r\n\t\trequestAnimationFrame(function () {\r\n\t focusTarget.focus();\r\n\t });\r\n\r\n\t\tdoc.addEventListener('mousedown', ARIAmodal.outsideClose, false);\r\n\t\tdoc.addEventListener('touchend', ARIAmodal.outsideClose, false);\r\n\r\n\t\treturn [initialTrigger, activeModal, returnToBody];\r\n\t};\r\n\r\n\r\n\t/**\r\n\t * Function for closing a modal dialog.\r\n\t * Remove inert, and aria-hidden from non-dialog parent elements.\r\n\t * Remove activeClass from body element.\r\n\t * Focus the appropriate element.\r\n\t */\r\n\tARIAmodal.closeModal = function ( e ) {\r\n\t\tvar trigger = doc.getElementById(initialTrigger) || null;\r\n\t\tvar i;\r\n\t\tvar m;\r\n\r\n\t\t/**\r\n\t\t * Loop through all the elements that were hidden to\r\n\t\t * screen readers, and had inert to negate their\r\n\t\t * children from being focusable.\r\n\t\t */\r\n\t\tfor ( i = 0; i < children.length; i++ ) {\r\n\t\t\tif ( !children[i].hasAttribute('data-keep-inert') ) {\r\n\t\t\t\tchildren[i].removeAttribute('inert');\r\n\t\t\t}\r\n\r\n\t\t\tchildren[i].removeAttribute('data-keep-inert');\r\n\r\n\t\t\tif ( children[i].getAttribute('data-keep-hidden') ) {\r\n\t\t\t\tchildren[i].setAttribute('aria-hidden', children[i].getAttribute('data-keep-hidden') );\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tchildren[i].removeAttribute('aria-hidden');\r\n\t\t\t}\r\n\r\n\t\t\tchildren[i].removeAttribute('data-keep-hidden');\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * When a modal closes:\r\n\t\t * the modal-open flag on the body can be removed,\r\n\t\t * and the modal should be reset to hidden.\r\n\t\t */\r\n\t\tbody.classList.remove(activeClass);\r\n\r\n\t\tfor ( m = 0; m < modal.length; m++ ) {\r\n\t\t\tif ( !modal[m].hasAttribute('hidden') ) {\r\n\t\t\t\tmodal[m].hidden = true;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * Return focus to the trigger that opened the modal dialog.\r\n\t\t * If the trigger doesn't exist for some reason, move focus to\r\n\t\t * either the
, or instead.\r\n\t\t * Reset initialTrigger and activeModal since everything should be reset.\r\n\t\t */\r\n\t\tif ( trigger !== null ) {\r\n\t\t\ttrigger.focus();\r\n\t\t}\r\n\t\telse {\r\n\t\t\tif ( main && !returnToBody ) {\r\n\t\t\t\tmain.tabIndex = -1;\r\n\t\t\t\tmain.focus();\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tbody.tabIndex = -1;\r\n\t\t\t\tbody.focus();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinitialTrigger = undefined;\r\n\t\tactiveModal = undefined;\r\n\t\treturnToBody = false;\r\n\r\n\t\treturn [initialTrigger, activeModal, returnToBody];\r\n\t};\r\n\r\n\r\n\t/**\r\n\t * Keyboard controls for when the modal dialog is open.\r\n\t * ESC should close the dialog (when not an alert)\r\n\t */\r\n\tARIAmodal.keyEvents = function ( e ) {\r\n\t\tvar keyCode = e.keyCode || e.which;\r\n\t\tvar escKey = 27;\r\n\t\tvar enterKey = 13;\r\n\t\tvar spaceKey = 32;\r\n\t\tvar tabKey = 9;\r\n\t\tvar firstFocus, lastFocus;\r\n\r\n\t\tif ( e.target.hasAttribute('data-modal-open') ) {\r\n\t\t\tswitch ( keyCode ) {\r\n\t\t\t\tcase enterKey:\r\n\t\t\t\tcase spaceKey:\r\n\t\t\t\t\te.preventDefault();\r\n\t\t\t\t\te.target.click();\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif ( body.classList.contains(activeClass) ) {\r\n\t\t\tswitch ( keyCode ) {\r\n\t\t\t\tcase escKey:\r\n\t\t\t\t\tARIAmodal.closeModal();\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\tif ( body.classList.contains(activeClass) ) {\r\n\t\t\t\t// Get first and last focusable elements from activeModal\r\n\t\t\t\tfirstFocus = activeModal.querySelector('.' + firstClass);\r\n\t\t\t\tlastFocus = activeModal.querySelector('.' + lastClass);\r\n\t\t\t}\r\n\r\n\t\t\tif ( doc.activeElement.classList.contains(lastClass) ) {\r\n\t\t\t\tif ( keyCode === tabKey && !e.shiftKey ) {\r\n\t\t\t\t\te.preventDefault();\r\n\t\t\t\t\tif ( firstFocus !== undefined ) {\r\n\t\t\t\t\t\tfirstFocus.focus();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif ( doc.activeElement.classList.contains(firstClass) ) {\r\n\t\t\t\tif ( keyCode === tabKey && e.shiftKey ) {\r\n\t\t\t\t\te.preventDefault();\r\n\t\t\t\t\tif ( lastFocus !== undefined ) {\r\n\t\t\t\t\t\tlastFocus.focus();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}; // ARIAmodal.keyEvents()\r\n\r\n\r\n\t/**\r\n\t * If a dialog is opened and a user mouse clicks or touch screen taps outside\r\n\t * the visible bounds of the dialog content (onto the overlay 'screen') then\r\n\t * the dialog should run the close function.\r\n\t */\r\n\tARIAmodal.outsideClose = function ( e ) {\r\n\t\tif ( body.classList.contains(activeClass) && !e.target.hasAttribute('data-modal-open') ) {\r\n\t\t\tvar isClickInside = activeModal.contains(e.target);\r\n\r\n\t\t\tif ( !isClickInside && activeModal.getAttribute('role') !== 'alertdialog') {\r\n\t\t\t\tARIAmodal.closeModal();\r\n\t\t\t}\r\n\t\t}\r\n\t}; // ARIAmodal.outsideClose()\r\n\r\n\r\n\t/**\r\n\t * Open a modal dialog on page load\r\n\t */\r\n\tARIAmodal.autoLoad = function ( ) {\r\n\t\tvar getAuto = doc.querySelectorAll('[data-modal-auto]');\r\n\t\tvar hashValue = w.location.hash || null;\r\n\t\tvar autoOpen;\r\n\t\tvar useHash = false;\r\n\t\tvar e = null;\r\n\r\n\t\t/**\r\n\t\t * A modal ID in the URL should take precedent over any data attributes on\r\n\t\t * the page. The script must first check if a hash exists, and then if so,\r\n\t\t * does it match an ID in the document? And finally, is that ID associated\r\n\t\t * with a modal dialog? If so, set useHash to TRUE.\r\n\t\t */\r\n\t\tif ( hashValue !== null ) {\r\n\t\t\tautoOpen = hashValue.split('#')[1];\r\n\r\n\t\t\t// stop right here if a stray hash is at the end of the URL\r\n\t\t\tif ( autoOpen === '' ) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\telse if ( autoOpen === '!null' ) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\t// Check that the hash actually represent an element, or is it null?\r\n\t\t\t\tvar checkforDialog = doc.getElementById(autoOpen) || null;\r\n\r\n\t\t\t\t// If not null...\r\n\t\t\t\tif ( checkforDialog !== null ) {\r\n\t\t\t\t\t// Do a final check to ensure the hash/ID is for a dialog or alertdialog\r\n\t\t\t\t\t// and if so, return useHash as TRUE\r\n\t\t\t\t\tif ( checkforDialog.getAttribute('role') === 'dialog' || checkforDialog.getAttribute('role') === 'alertdialog') {\r\n\t\t\t\t\t\tuseHash = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * Since only a single modal should be open at a time, perform the following\r\n\t\t * if/else checks:\r\n\t\t *\r\n\t\t * If a URL contains a fragment that matches the ID of a dialog, auto open it.\r\n\t\t *\r\n\t\t * Else If the attribute was found on a dialog container, then directly perform\r\n\t\t * the openModal function.\r\n\t\t *\r\n\t\t * Else If a button or \"button\" was found with the attribute data-modal-auto,\r\n\t\t * then perform a click to auto-open this dialog.\r\n\t\t *\r\n\t\t * If a dialog or button does not have the attribute data-modal-auto-persist,\r\n\t\t * then update the URL fragment to a value that will not open a modal dialog on\r\n\t\t * subsequent reloads.\r\n\t\t *\r\n\t\t * If data-modal-auto-persist does exist, then you can continue to bother your\r\n\t\t * users with likely a poor user experience. :)\r\n\t\t */\r\n\r\n\t\tif ( useHash ) {\r\n\t\t\tARIAmodal.openModal( e, autoOpen );\r\n\r\n\t\t\tif ( getAuto.length > 1 ) {\r\n\t\t\t\tconsole.warn('Only the modal indicated by the hash value will load.');\r\n\t\t\t}\r\n\t\t}\r\n\t\telse if ( getAuto.length !== 0 ) {\r\n\t\t\tif ( getAuto[0].getAttribute('role') === 'dialog' || getAuto[0].getAttribute('role') === 'alertdialog' ) {\r\n\r\n\t\t\t\tautoOpen = getAuto[0].id;\r\n\t\t\t\tARIAmodal.openModal( e, autoOpen );\r\n\r\n\t\t\t\tif ( getAuto.length > 1 ) {\r\n\t\t\t\t\tconsole.warn('Multiple modal dialogs can not auto load.');\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse if ( getAuto[0].getAttribute('role') === 'button' || getAuto[0].tagName === 'BUTTON' ) {\r\n\t\t\t \tautoOpen = getAuto[0].id;\r\n\t\t\t \tgetAuto[0].click();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * Ideally a user shouldn't have to be barraged with the same modal dialog over\r\n\t\t * and over again, if they refresh their browser window.\r\n\t\t *\r\n\t\t * So unless the attribute \"data-modal-auto-persist\" exists, which should be used\r\n\t\t * to specifically state that a particular dialog should continue to auto-load,\r\n\t\t * regardless of page refresh, modify the URL fragment to a string that will\r\n\t\t * not auto-load a modal.\r\n\t\t */\r\n\t\tif ( getAuto.length !== 0 && !doc.getElementById(autoOpen).hasAttribute('data-modal-auto-persist') ) {\r\n\t\t\tw.location.replace(\"#!null\");\r\n\t\t}\r\n\t};\r\n\r\n\r\n\t/**\r\n\t * Initialize modal functions.\r\n\t * If expanding this script, put\r\n\t * additional initialize functions here.\r\n\t */\r\n\tARIAmodal.init = function () {\r\n\t\tARIAmodal.organizeDOM();\r\n\t\tARIAmodal.setupTrigger();\r\n\t\tARIAmodal.setupModal();\r\n\t\tARIAmodal.autoLoad();\r\n\t};\r\n\r\n\r\n\t/**\r\n\t * Go go JavaScript!\r\n\t */\r\n\tARIAmodal.init();\r\n\r\n})( window, document );","import Utils from './utils';\r\n\r\ndeclare var ShoppingBasketParms: any;\r\ndeclare var globalParms: any;\r\n\r\n/**********************************\r\n* Mega Menu Functions \r\n**********************************/\r\n\r\nfunction getElementIndex(node: HTMLElement): number {\r\n var index = 0;\r\n while ((node = node.previousElementSibling as HTMLElement)) {\r\n index++;\r\n }\r\n return index;\r\n}\r\n\r\n//Initialise menu\r\nfunction initMenu(menu: any): void {\r\n //Only load the initial menu for desktop\r\n if (screen.width > 1023) {\r\n menu.setAttribute('data-display', 'd');\r\n var level2 = document.querySelectorAll('[data-navLevel = \"2\"]')[0];\r\n if (level2) {\r\n level2.querySelector('.category-column > ul > li:first-child')?.setAttribute('data-hovered', 'true')\r\n level2.querySelector('.category-column > ul > li:first-child button')?.setAttribute('aria-expanded', 'true');\r\n level2.querySelectorAll('.category-column-sub')[0].setAttribute('data-active', 'true');\r\n }\r\n }\r\n else {\r\n menu.setAttribute('data-display', 'm');\r\n }\r\n}\r\n\r\n//Reset menu\r\nfunction resetMenu(menu: any): void {\r\n menu.querySelectorAll('[aria-expanded]').forEach(function (item: any) {\r\n item.setAttribute('aria-expanded', 'false');\r\n });\r\n menu.querySelectorAll('[data-active]:not([data-navlevel=\"3\"])').forEach(function (item: any) {\r\n item.setAttribute('data-active', 'false');\r\n });\r\n menu.querySelectorAll('[data-hovered]').forEach(function (item: any) {\r\n item.setAttribute('data-hovered', 'false');\r\n });\r\n menu.querySelectorAll('.active').forEach(function (item: any) {\r\n item.classList.remove('active');\r\n });\r\n\r\n initMenu(menu);\r\n}\r\n\r\n//action: on|off\r\nfunction onOffItems(element: HTMLElement, action: string): void {\r\n element.setAttribute('aria-expanded', (action === \"on\") ? 'true' : 'false');\r\n if (action === \"on\") {\r\n element.parentElement?.classList.add('active');\r\n } else {\r\n element.parentElement?.classList.remove('active');\r\n }\r\n\r\n element.nextElementSibling?.setAttribute('data-active', (action === \"on\") ? 'true' : 'false');\r\n}\r\n\r\nfunction handleMobileMenu(this: HTMLElement) {\r\n var expanded = this.getAttribute('aria-expanded');\r\n var body = document.body;\r\n if (expanded == \"false\") {\r\n this.setAttribute('aria-expanded', \"true\");\r\n document.querySelector('header.site-head')?.setAttribute('data-mobile-toggled', \"true\");\r\n body.classList.add(\"menu-open\");\r\n } else {\r\n this.setAttribute('aria-expanded', \"false\");\r\n document.querySelector('header.site-head')?.setAttribute('data-mobile-toggled', \"false\");\r\n body.classList.remove(\"menu-open\");\r\n //TODO: what are we resetting? resetMenu();\r\n }\r\n}\r\n\r\nfunction closeMobileMenu() {\r\n var body = document.body;\r\n document.querySelector('button.mobile-menu')?.setAttribute('aria-expanded', \"false\");\r\n document.querySelector('header.site-head')?.setAttribute('data-mobile-toggled', \"false\");\r\n body.classList.remove(\"menu-open\");\r\n // handleMobileMenu;\r\n}\r\n\r\n// Standard offset.top not working properly: https://medium.com/@alexcambose/js-offsettop-property-is-not-great-and-here-is-why-b79842ef7582\r\nfunction getOffsetTop(element: any) {\r\n let offsetTop = 0;\r\n let parentElem = element;\r\n while (parentElem) {\r\n offsetTop += parentElem.offsetTop;\r\n parentElem = parentElem.offsetParent;\r\n }\r\n return offsetTop;\r\n}\r\n\r\n//we have js\r\nif (document.documentElement.classList.contains('no-js')) {\r\n document.documentElement.classList.remove('no-js');\r\n document.documentElement.classList.add('js');\r\n\r\n if (document.getElementsByClassName('site-head').length) {\r\n\r\n var menu = document.querySelector('#primary-navigation');\r\n\r\n if (menu) {\r\n\r\n initMenu(menu);\r\n\r\n //TODO - add debounce - resize init();\r\n //window.addEventListener('resize', function (e) {\r\n // if (screen.width > 1023 && menu.getAttribute('data-display') != \"d\") {\r\n // resetMenu(menu);\r\n // }\r\n // else if (screen.width <= 1023 && menu.getAttribute('data-display') != \"m\") {\r\n // resetMenu(menu);\r\n // }\r\n //});\r\n\r\n //Main menu click event\r\n menu.addEventListener('click', function (e) {\r\n let clickElement = e.srcElement;\r\n if ((clickElement as HTMLElement).tagName.toLowerCase() == 'span' || (clickElement as HTMLElement).tagName.toLowerCase() == 'svg') {\r\n clickElement = (clickElement as HTMLElement)?.closest('button')\r\n }\r\n if ((clickElement as HTMLElement)?.classList.contains('cat-link')) {\r\n var level = (clickElement as HTMLElement)?.closest('[data-navLevel]')?.getAttribute(\"data-navLevel\");\r\n if (level != \"2\") {\r\n //Simple toggle\r\n if ((clickElement as HTMLElement)?.getAttribute('aria-expanded') == \"false\") {\r\n //Switch off any items that are active\r\n var activeItemLevel = document.querySelector('[data-navLevel = \"' + level + '\"]');\r\n var activeItems = activeItemLevel?.querySelectorAll('button[aria-expanded=\"true\"]');\r\n for (var i = 0, max = activeItems?.length; i < (max ? max : 0); i++) {\r\n if (activeItems != null && activeItems[i]?.closest('[data-navLevel]')?.getAttribute(\"data-navLevel\") == level) {\r\n onOffItems(activeItems[i] as HTMLElement, 'off');\r\n }\r\n }\r\n onOffItems((clickElement as HTMLElement), 'on');\r\n }\r\n else {\r\n onOffItems((clickElement as HTMLElement), 'off');\r\n }\r\n }\r\n else {\r\n //Level 2 items\r\n var index = getElementIndex((clickElement as HTMLElement)?.parentElement as HTMLElement);\r\n var menuSubs = document.querySelectorAll('.category-column-sub');\r\n\r\n var menuSub = null;\r\n for (var i = 0, max1 = menuSubs.length; i < max1; i++) {\r\n if (index == i) {\r\n menuSub = menuSubs[i];\r\n }\r\n }\r\n if ((clickElement as HTMLElement).getAttribute('aria-expanded') == \"false\") {\r\n //Switch off any active items first\r\n var activeItem = document.querySelector('.category-column ul li[data-hovered=\"true\"]');\r\n if (activeItem !== null) {\r\n var activeItemIndex = getElementIndex(activeItem as HTMLElement);\r\n activeItem.setAttribute('data-hovered', 'false');//li\r\n activeItem.querySelector('button')?.setAttribute('aria-expanded', 'false');//button\r\n var menuSubOff = null;\r\n for (var i = 0, max2 = menuSubs.length; i < max2; i++) {\r\n if (activeItemIndex == i) {\r\n menuSubOff = menuSubs[i];\r\n }\r\n }\r\n menuSubOff?.setAttribute('data-active', 'false');\r\n }\r\n (clickElement as HTMLElement).setAttribute('aria-expanded', 'true');\r\n (clickElement as HTMLElement).parentElement?.setAttribute('data-hovered', 'true');\r\n menuSub?.setAttribute('data-active', 'true');\r\n }\r\n }\r\n }\r\n else {\r\n // if non .cat-link\r\n if ((clickElement as HTMLElement).closest('[data-navLevel]')?.getAttribute(\"data-navLevel\") == \"1\") {\r\n resetMenu(menu);\r\n }\r\n }\r\n\r\n });\r\n\r\n //Close menu when user clicks outside\r\n document.addEventListener('click', function (e) {\r\n // This closes menu on click outside\r\n let target = e.target;\r\n if (menu && target && !menu.contains(target as HTMLElement)) {\r\n resetMenu(menu);\r\n }\r\n });\r\n\r\n //TODO // key functions for keyboard navigation\r\n //var level2MenuCatColumns = menu.querySelectorAll('.category-column');\r\n //for (var i = 0, max = level2MenuCatColumns.length; i < max; i++) {\r\n // var level2MenuCatColumn = level2MenuCatColumns[i];\r\n // level2MenuCatColumn.addEventListener('keyup', function (e) {\r\n // if ((e as Event).key == \"Enter\") {\r\n // console.log(e.srcElement);\r\n // var firstElementSub = document.querySelectorAll('.category-column-sub[data-active=\"true\"] ul li a')[0];\r\n // firstElementSub.focus();\r\n // }\r\n // });\r\n //}\r\n\r\n var level2MenuSub = menu.querySelectorAll('.category-column-sub');\r\n let max = level2MenuSub.length;\r\n for (var i = 0; i < max; i++) {\r\n var level2MenuSubAnchors = level2MenuSub[i].querySelectorAll('a');\r\n let max2 = level2MenuSubAnchors.length;\r\n for (var b = 0; b < max2; b++) {\r\n if (b + 1 == max2) {\r\n level2MenuSubAnchors[b].addEventListener('keydown', function (e) {\r\n if (e.keyCode == 9) {\r\n menu?.querySelector('.category-column li[data-hovered=\"true\"]')?.querySelector('button')?.focus();\r\n }\r\n });\r\n }\r\n }\r\n }\r\n\r\n //Breadcrumb functions\r\n var breadcrumbButtons = menu.querySelectorAll('.breadcrumb .parent-page');\r\n var maxBreadcrumbs = breadcrumbButtons.length;\r\n for (var i = 0; i < maxBreadcrumbs; i++) {\r\n breadcrumbButtons[i].addEventListener('click', function (e) {\r\n var navLevelElm = (e.srcElement as HTMLElement).closest('[data-navlevel]') as HTMLElement;\r\n var navLevel = navLevelElm.getAttribute('data-navlevel');\r\n if (navLevel && parseInt(navLevel) != 2) {\r\n navLevelElm = navLevelElm.closest('li') as HTMLElement;\r\n navLevelElm.setAttribute('class', 'false');\r\n }\r\n else {\r\n navLevelElm.setAttribute('data-active', 'false');\r\n }\r\n\r\n navLevelElm.querySelectorAll('[aria-expanded]').forEach(function (item: any) {\r\n item.setAttribute('aria-expanded', 'false');\r\n });\r\n navLevelElm.querySelectorAll('[data-active]:not([data-navlevel=\"3\"])').forEach(function (item: any) {\r\n item.setAttribute('data-active', 'false');\r\n });\r\n navLevelElm.querySelectorAll('[data-hovered]').forEach(function (item: any) {\r\n item.setAttribute('data-hovered', 'false');\r\n });\r\n navLevelElm.querySelectorAll('.active').forEach(function (item: any) {\r\n item.classList.remove('active');\r\n });\r\n\r\n if (navLevel && parseInt(navLevel) == 2) {\r\n //Go up a level and switch off the button that opened the level\r\n var navLevelElmUp1 = navLevelElm.closest('[data-navlevel=\"' + (parseInt(navLevel) - 1) + '\"]');\r\n var navLevelElmUp1Button = navLevelElmUp1?.querySelector('button[aria-expanded=\"true\"]');\r\n if (navLevelElmUp1Button != null) {\r\n navLevelElmUp1Button.setAttribute('aria-expanded', 'false');\r\n }\r\n }\r\n });\r\n }\r\n\r\n //Mobile menu functions\r\n var mobilemenu = document.querySelector('button.mobile-menu');\r\n mobilemenu?.addEventListener(\"click\", handleMobileMenu); \r\n\r\n var mobilebg = document.querySelector('.mobile-background');\r\n mobilebg?.addEventListener(\"click\", closeMobileMenu);\r\n\r\n var tertiarynav = document.querySelector('.tertiary-nav');\r\n if (tertiarynav && mobilemenu && mobilebg) {\r\n var primarynav = document.getElementById('nav-container');\r\n if (primarynav) {\r\n primarynav.style.top = \"81px\";\r\n }\r\n (mobilebg as HTMLElement).style.top = \"81px\";\r\n }\r\n }\r\n\r\n ///////////////////////////////////////////////////////////////////\r\n // Sticky search bar on mobile //\r\n ///////////////////////////////////////////////////////////////////\r\n\r\n var sh = document.querySelector(\".site-head\");\r\n var h = document.querySelector(\".search-container\");\r\n var stuck = false;\r\n var stickPoint = getOffsetTop(h);\r\n\r\n window.onscroll = function (e) {\r\n var offset = window.pageYOffset;\r\n\r\n if (!stuck && offset > stickPoint) {\r\n if (h) h.classList.add('stuck');\r\n if (sh) sh.classList.add('stuck');\r\n stuck = true;\r\n } else if (stuck && offset <= stickPoint) {\r\n if (h) h.classList.remove('stuck');;\r\n if (sh) sh.classList.remove('stuck');\r\n stuck = false\r\n }\r\n }\r\n }\r\n\r\n /*toggles, used in mobile footer used in all pages*/\r\n var ToggleButtons = document.querySelectorAll('[data-toggle-parent]');\r\n if (ToggleButtons.length) {\r\n ToggleButtons.forEach(function (toggle) {\r\n if (!toggle.classList.contains('click-bound')) {\r\n toggle.classList.add('click-bound');\r\n toggle.addEventListener('click', function (e) {\r\n let elem = e.target as HTMLElement;\r\n if (elem.getAttribute('aria-expanded') == \"false\") {\r\n elem.setAttribute('aria-expanded', 'true')\r\n }\r\n else {\r\n elem.setAttribute('aria-expanded', 'false');\r\n }\r\n })\r\n }\r\n })\r\n }\r\n\r\n\r\n\r\n\r\n var loginPartial = document.querySelector(\".loginPartial\");\r\n var loginPartialMobile = document.getElementById(\"sign-in-mobile\");\r\n\r\n if (loginPartial) {\r\n if (globalParms && globalParms.LoginPartialURL) {\r\n fetch(globalParms.LoginPartialURL)\r\n .then(response => response.text())\r\n .then(function (data) {\r\n if (data && loginPartial) {\r\n loginPartial.innerHTML = data;\r\n }\r\n if (data && loginPartialMobile) {\r\n loginPartialMobile.innerHTML = data;\r\n }\r\n });\r\n }\r\n }\r\n\r\n var accountLinks = document.querySelector(\".account-links\");\r\n\r\n if (accountLinks) {\r\n if (globalParms && globalParms.AccountLinksURL) {\r\n fetch(globalParms.AccountLinksURL)\r\n .then(response => response.text())\r\n .then(function (data) {\r\n if (data && accountLinks) {\r\n accountLinks.innerHTML = data;\r\n var basketButton = document.getElementById(\"basketButton\");\r\n if (basketButton) {\r\n basketButton.addEventListener(\"click\", function () {\r\n window.location.href = basketButton!.getAttribute(\"data-url\")!;\r\n });\r\n\r\n ShoppingBasket_UpdateItemCount();\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n initLightYouTube();\r\n\r\n document.addEventListener('DOMContentLoaded', function () {\r\n let mainNavContainers = document.querySelectorAll('#nav-container ul li div[data-navlevel=\"2\"]')\r\n let navHeight = 0;\r\n for (let i = 0; i < mainNavContainers.length; i++) { \r\n let elemHeight = window.getComputedStyle(mainNavContainers[i]).getPropertyValue(\"height\");\r\n if (Number(elemHeight.replace('px','')) > navHeight) {\r\n navHeight = Number(elemHeight.replace('px',''));\r\n }\r\n }\r\n let mainContent = document.getElementById('main-content');\r\n if (mainContent) {\r\n mainContent.style.minHeight = (navHeight - 86) + 'px';\r\n }\r\n });\r\n}\r\n\r\nexport function ShoppingBasket_UpdateItemCount() {\r\n var itemCount = document.querySelector(\".basket--link span.item-count\");\r\n\r\n if (itemCount != null) {\r\n try {\r\n var cookie = Utils.getCookie(ShoppingBasketParms.CookieKey);\r\n if (cookie) {\r\n var basketDataJSON = JSON.parse(unescape(cookie));\r\n\r\n itemCount.innerHTML = basketDataJSON.NumberOfItems;\r\n\r\n } else {\r\n itemCount.innerHTML = \"0\";\r\n }\r\n }\r\n catch (err) { console.log(err) }\r\n }\r\n}\r\n\r\n/* Light YouTube Embeds by @labnol */\r\n/* and img lazy loads */\r\n/* Web: http://labnol.org/?p=27941 */\r\n\r\nfunction initLightYouTube() {\r\n var div, n,\r\n v = document.getElementsByClassName(\"youtube-player\");\r\n for (n = 0; n < v.length; n++) {\r\n div = document.createElement(\"div\");\r\n div.setAttribute(\"data-id\", (v[n] as any).dataset.id);\r\n div.innerHTML = labnolThumb((v[n] as any).dataset.id);\r\n div.onclick = labnolIframe;\r\n v[n].appendChild(div);\r\n }\r\n loadLazyImages();\r\n\r\n function labnolThumb(id: string) {\r\n var thumb = '', //hqdefault\r\n play = '
';\r\n return thumb.replace(\"ID\", id) + play;\r\n }\r\n\r\n function labnolIframe(evt: Event) {\r\n let target = (evt.target as HTMLElement).parentNode;\r\n if (target) {\r\n var iframe = document.createElement(\"iframe\");\r\n var embed = \"https://www.youtube.com/embed/ID?autoplay=1\";\r\n let dataID = (target as HTMLElement).getAttribute(\"data-id\");\r\n if (dataID) iframe.setAttribute(\"src\", embed.replace(\"ID\", dataID as string));\r\n iframe.setAttribute(\"frameborder\", \"0\");\r\n iframe.setAttribute(\"allowfullscreen\", \"1\");\r\n let parent = (target as HTMLElement).parentElement;\r\n if (parent) parent.replaceChild(iframe, target);\r\n }\r\n }\r\n\r\n // Lazy-load images. Observe images until they are loaded.\r\n function loadLazyImages() {\r\n var lazyLoadOptions = {\r\n // https://www.competa.com/blog/lazy-loading-with-the-intersection-observer/\r\n //root: document.querySelector('div.gak-container'), // Comment this to use the default browser's viewport.\r\n rootMargin: '25px',\r\n threshold: 0//1.0\r\n };\r\n\r\n //initImagesForProductListings();\r\n\r\n var myImgs = document.querySelectorAll('img[lazy-src]');\r\n try {\r\n var observer = new IntersectionObserver(function (entries) {\r\n //console.log('loadLazyImages: entries ' + entries.length);\r\n entries.forEach(function (entry) {\r\n if (entry.isIntersecting) {\r\n // Load image\r\n var imgElem = entry.target;\r\n loadLazyImages_doImage(imgElem as HTMLElement);\r\n //console.log('in the view');\r\n observer.unobserve(imgElem);\r\n } else {\r\n //console.log('out of view');\r\n }\r\n });\r\n }, lazyLoadOptions);\r\n\r\n myImgs.forEach(function (image) {\r\n observer.observe(image);\r\n });\r\n }\r\n catch (err) {\r\n loadLazyImages_notSupported(myImgs);\r\n }\r\n\r\n function loadLazyImages_notSupported(myImgs: any) {\r\n // IntersectionObserver (and forEach()) not supported on Safari and old versions of IE 28/01/2019.\r\n //console.log(\"lazy load images not supported\");\r\n for (var i = 0, len = myImgs.length; i < len; i++) {\r\n loadLazyImages_doImage(myImgs[i]);\r\n }\r\n }\r\n\r\n function loadLazyImages_doImage(imgElem: HTMLElement) {\r\n setTimeout(function () {\r\n var realSrc = imgElem.getAttribute(\"lazy-src\"); //$(imgElem).attr(\"lazy-src\");\r\n if (realSrc) {\r\n imgElem.setAttribute(\"src\", realSrc); //.src = realSrc;\r\n imgElem.removeAttribute(\"lazy-src\"); //$(imgElem).removeAttr(\"lazy-src\");\r\n }\r\n }, 1);\r\n }\r\n\r\n //function initImagesForProductListings() {\r\n // $('ul.productListing').each(function (index) {\r\n // var curProdList = $(this);\r\n // loadImagesForProductListings_BasedOnView(curProdList);\r\n // });\r\n //}\r\n }\r\n\r\n};\r\n\r\n//function loadImagesForProductListings_BasedOnView(prodListing) {\r\n// var isGridView = prodListing.hasClass('view-as-grid');\r\n// prodListing.find('.productImageWrapper img').each(function (index) {\r\n// var img = $(this);\r\n// setTimeout(function () {\r\n// var newImgUrl = img.closest('.innerwrapper').data(isGridView ? 'prodimggridview' : 'prodimglistview');\r\n// // Set the new Img Url to the proper attribute src or lazy-src.\r\n// if (img.attr(\"lazy-src\")) {\r\n// img.attr(\"lazy-src\", newImgUrl);\r\n// }\r\n// else if (img[0].src) {\r\n// img[0].src = newImgUrl;\r\n// }\r\n// }, 1);\r\n// });\r\n//}","declare var autoCompleteDebug: boolean\r\ndeclare var autoCompleteUrl: string\r\ndeclare var directMatchUrl: string\r\n\r\nvar log = !autoCompleteDebug\r\n ? function (test: any[]) { }\r\n : function (test: any[]) {\r\n if (console) {\r\n console.log.apply(arguments);\r\n }\r\n };\r\nvar warn = autoCompleteDebug ? console.warn : function () { };\r\nvar jsonIndent = autoCompleteDebug ? 2 : undefined;\r\n//var /* const */ autoCompleteDelay = 350; // ms debounce delay on auto-complete search\r\n// Alberto Oliva 2019-03-04. Loop54 recommended to send a request per typed letter.\r\nconst autoCompleteDelay = 100; // ms debounce delay on auto-complete search\r\nconst showHideDelay = 500; // ms\r\nconst selInputBox = 'globalSearchtext';\r\n\r\nvar autoCompleteIsShowing = false;\r\n\r\ntype AutoCompleteSearchRequestModel = {\r\n UserId: string\r\n QueryString: string\r\n};\r\n\r\nvar baseAutoCompleteSearchRequest: AutoCompleteSearchRequestModel =\r\n{\r\n UserId: \"A-User-ID\",\r\n QueryString: \"\"\r\n}\r\n\r\nvar lastAutoCompleteResult: any = { Success: false }; // Loop54's JSON doesn't use camelCase.\r\nvar lastDirectResult: any = null;\r\n\r\nfunction checkCanSearch() {\r\n var canSrch = (document.getElementById(selInputBox) as HTMLInputElement).value!.length !== 0; \r\n document.getElementById('globalSearchButton')?.setAttribute('disabled', String(!canSrch));\r\n}\r\n\r\nfunction doAutoCompleteSearch() {\r\n let now = new Date();\r\n let ms = now.getUTCSeconds() * 1000 + now.getUTCMilliseconds();\r\n log([\r\n 'Auto Complete Search Starts Here! at ' + ms.toString() + 'ms'\r\n ]);\r\n\r\n var srchText = (document.getElementById(selInputBox) as HTMLInputElement).value;\r\n\r\n var req = baseAutoCompleteSearchRequest;\r\n\r\n req.QueryString = srchText;\r\n log(['AutoComplete query being sent', JSON.stringify(req)]);\r\n\r\n function showNewResults() {\r\n if (showAutoCompleteResults({ autoComplete: lastAutoCompleteResult, direct: lastDirectResult })) {\r\n showAutoComplete(true);\r\n } else {\r\n hideAutoComplete();\r\n }\r\n }\r\n\r\n const requestHeaders: HeadersInit = new Headers();\r\n requestHeaders.set('Content-Type', 'application/json');\r\n fetch(autoCompleteUrl, {\r\n method: 'POST',\r\n headers: requestHeaders,\r\n body: JSON.stringify(req)\r\n })\r\n .then(response => response.json())\r\n .then(function (data: any) {\r\n log(['Raw Output From AutoComplete Search', JSON.stringify(data)]);\r\n lastAutoCompleteResult = data;\r\n showNewResults();\r\n });\r\n\r\n\r\n fetch(directMatchUrl.replace('--q--', srchText), {\r\n method: 'GET',\r\n headers: requestHeaders,\r\n })\r\n .then(response => response.json())\r\n .then(function (data) {\r\n log([\"Have direct results: \", JSON.stringify(data)]);\r\n lastDirectResult = data;\r\n showNewResults();\r\n });\r\n}\r\n\r\n// Alberto Oliva 2019-03-04. Loop54 recommended to send a request per typed letter. Need to add a delay on \"keydown\", as the event will be triggered before the value of the textbox is properly updated, otherwise.\r\n//let autoCompleteSearch = debounce(doAutoCompleteSearch, autoCompleteDelay, { 'maxWait': 1000 });\r\nlet autoCompleteSearch = function () { setTimeout(doAutoCompleteSearch, autoCompleteDelay); };\r\n\r\nfunction hideAutoComplete() {\r\n if (autoCompleteIsShowing) {\r\n setTimeout(() => {\r\n let el = document.getElementById('searchAutoCompleteList');\r\n el!.style!.display = 'none';\r\n el!.style!.opacity = '0';\r\n el!.classList.remove('show-results');\r\n document.getElementById('clearbutton')?.classList.remove('show');\r\n }, showHideDelay);\r\n\r\n autoCompleteIsShowing = false;\r\n }\r\n}\r\n\r\nfunction onClickAutoCompleteResult(e: any) {\r\n e.preventDefault();\r\n hideAutoComplete();\r\n log([\"AutoComplete Entry Click!\"]);\r\n useAutoCompleteForSearch(e.target.closest('li'));\r\n}\r\n\r\nfunction onSearchKeyDown(e: any) {\r\n var d = e.key === 'ArrowDown' || e.key === 'Down';\r\n var u = e.key === 'ArrowUp' || e.key === 'Up';\r\n var l = e.key === 'ArrowLeft' || e.key === 'Left';\r\n var r = e.key === 'ArrowRight' || e.key === 'Right';\r\n if (autoCompleteIsShowing) {\r\n if (d || u) {\r\n e.preventDefault();\r\n\r\n let allLinks = document.getElementById('searchAutoCompleteLinks')!.children;\r\n\r\n let current = document.getElementById('searchAutoCompleteLinks')!.getElementsByClassName('selected')[0];\r\n\r\n for (let i = 0; i < allLinks.length; i++) {\r\n var link = allLinks[i];\r\n\r\n link.classList.remove('selected');\r\n }\r\n\r\n if (d) {\r\n let n = current?.nextElementSibling;\r\n if (n == null) {\r\n n = allLinks[0];\r\n }\r\n n!.classList.add('selected');\r\n } else {\r\n let p = current?.previousElementSibling;\r\n if (p == null) {\r\n p = allLinks[allLinks.length - 1];\r\n }\r\n p!.classList.add('selected');\r\n }\r\n } else if (e.key === \"Escape\" || e.key === 'Esc') {\r\n e.preventDefault();\r\n hideAutoComplete();\r\n } else if (!(l || r) && e.key !== \"Enter\") { // if (e.key === 'Backspace' || e.key === 'Delete' || e.key === 'Del') // \"Del\" for IE9/FF36 compat\r\n autoCompleteSearch();\r\n }\r\n return;\r\n }\r\n // Andriod Chrome doesn't provide keypress events, and here e.keyCode &\r\n // e.which are useless. So just fire autocomplete here rather than\r\n // in the keypress handled.\r\n if (e.key !== \"Enter\" && !(d || u || l || r)) {\r\n autoCompleteSearch();\r\n }\r\n}\r\n\r\nfunction onSearchKeyPress(e: any) {\r\n log(['onSearchKeyPress: ' + e.key]);\r\n if (e.key === \"Enter\") {\r\n if (autoCompleteIsShowing) {\r\n let sel = document.getElementById('searchAutoCompleteLinks')!.getElementsByClassName('selected');\r\n hideAutoComplete();\r\n if (sel.length > 0) {\r\n e.preventDefault();\r\n useAutoCompleteForSearch(sel[0]);\r\n return;\r\n }\r\n\r\n // Not selecting an auto-complete so just search from query\r\n return;\r\n }\r\n }\r\n autoCompleteSearch();\r\n}\r\n\r\nfunction show(el: HTMLElement, addDelay: boolean = false) {\r\n el!.classList.add('show-results');\r\n if (addDelay) {\r\n setTimeout(() => {\r\n el!.style!.display = 'block';\r\n el!.style!.opacity = '1';\r\n document.getElementById('clearbutton')?.classList.add('show');\r\n }, showHideDelay);\r\n } else {\r\n el!.style!.display = 'block';\r\n el!.style!.opacity = '1';\r\n document.getElementById('clearbutton')?.classList.add('show');\r\n }\r\n}\r\n\r\nfunction hide(el: HTMLElement, addDelay: boolean = false) {\r\n setTimeout(() => {\r\n el!.style!.display = 'none';\r\n el!.style!.opacity = '0';\r\n el!.classList.remove('show-results');\r\n }, showHideDelay);\r\n}\r\n\r\nfunction showAutoComplete(haveResults: boolean) {\r\n let el = document.getElementById('searchAutoCompleteList')!;\r\n // If not currently showing, only show if results (to avoid bouncing open\r\n //.to briefly show spinner before closing)\r\n if (haveResults && !autoCompleteIsShowing) {\r\n autoCompleteIsShowing = true;\r\n let el = document.getElementById('searchAutoCompleteList')!;\r\n show(el, true);\r\n }\r\n let spinner = document.getElementById('searchAutoCompleteWait')!;\r\n let list = document.getElementById('searchAutoCompleteLinks')!;\r\n\r\n if (haveResults) {\r\n log(['showAutoComplete: have results'])\r\n\r\n hide(spinner);\r\n show(el);\r\n show(list);\r\n } else {\r\n // No results (yet) show spinner\r\n log(['showAutoComplete: waiting for results'])\r\n show(spinner);\r\n list!.innerHTML = \"\";\r\n hide(list);\r\n }\r\n}\r\n\r\nfunction showAutoCompleteResults(autoCompleteResults: any) {\r\n var autoCompRes = autoCompleteResults.autoComplete;\r\n\r\n if (!autoCompRes.Success && !autoCompleteResults.direct) {\r\n warn(\"No autocomplete results\");\r\n return false;\r\n }\r\n var acr = [];\r\n if (autoCompleteResults.direct && autoCompleteResults.direct.title) {\r\n var dr = autoCompleteResults.direct;\r\n log([\"Have a direct result \"]);\r\n acr.push({ text: dr.title, direct: dr.url });\r\n }\r\n var facets = [], matches = [];\r\n\r\n if (autoCompRes.Success) {\r\n autoCompRes = autoCompRes.Data;\r\n matches = autoCompRes.AutoComplete.map(function (d: any) { return ({ text: d.Key, facet: null }); });\r\n\r\n let qry = autoCompRes.QueryString;\r\n facets = autoCompRes.AutoCompleteFacets\r\n ? autoCompRes.AutoCompleteFacets.map(function (d: any) { return ({ text: autoCompRes.AutoCompleteFacetingString, facet: d.Key }); })\r\n : [];\r\n }\r\n let results = acr.concat(facets, matches).slice(0, 10);\r\n\r\n if (results.length === 0) { return false; }\r\n\r\n var linksEl = document.getElementById('searchAutoCompleteLinks')!;\r\n\r\n linksEl.innerHTML = \"\";\r\n\r\n results.map(function (r: any) {\r\n var div = document.createElement('li');\r\n\r\n div.classList.add('auto-complete-result');\r\n\r\n var a = document.createElement('a');\r\n\r\n a.href = '#';\r\n\r\n a.setAttribute('data-query', r.text);\r\n\r\n if (r.direct) {\r\n div.classList.add(\"auto-complete-direct\");\r\n a.setAttribute('data-direct', r.direct);\r\n a.append('Browse to ' + r.text);\r\n } else {\r\n a.setAttribute('data-facet', r.facet || '');\r\n a.append(r.text);\r\n if (r.facet) {\r\n a.append(' in');\r\n var span = document.createElement('span')\r\n\r\n span.classList.add('complete-in-facet');\r\n span.textContent = r.facet;\r\n\r\n a.append(span);\r\n }\r\n }\r\n div.append(a);\r\n linksEl.append(div)\r\n return div;\r\n })\r\n\r\n return true;\r\n}\r\n\r\nfunction useAutoCompleteForSearch(ul: any) {\r\n var anchor = ul!.getElementsByTagName('a')!.item(0);\r\n var direct = anchor!.getAttribute('data-direct');\r\n if (direct) {\r\n document.location = direct;\r\n return;\r\n }\r\n\r\n console.log(anchor);\r\n\r\n let text = anchor!.getAttribute('data-query');\r\n let facet = anchor!.getAttribute('data-facet');\r\n (document.getElementById(selInputBox) as HTMLInputElement).value = text ?? \"\";\r\n (document.getElementById('globalSearchInitialFacet') as HTMLInputElement).value = facet ?? \"\";\r\n\r\n var searchForm = document.getElementById('globalSearchForm');\r\n searchForm.submit();\r\n}\r\n\r\nfunction initialise() {\r\n log([\"AutoComplete init\"]);\r\n var input = document.getElementById(selInputBox)!;\r\n if (input) {\r\n input.onkeydown = onSearchKeyDown;\r\n input.onkeypress = onSearchKeyPress;\r\n input.onchange = checkCanSearch;\r\n\r\n checkCanSearch();\r\n\r\n document.getElementById('searchAutoCompleteLinks')!.onclick = onClickAutoCompleteResult;\r\n\r\n document.body.onclick = function (e) {\r\n hideAutoComplete();\r\n };\r\n document.getElementById('clearbutton')!.onclick = function (e) {\r\n (document.getElementById(selInputBox) as HTMLInputElement).value = '';\r\n };\r\n }\r\n}\r\n\r\ndocument.addEventListener(\"DOMContentLoaded\", function (event) {\r\n initialise();\r\n});\r\n","var elements = document.getElementsByClassName(\"product-card\");\r\nvar productDetailsEl = document.getElementsByClassName(\"pdp-basket\").item(0);\r\n\r\nvar pushEnhancedEcommerce = function () {\r\n pushEcommerce();\r\n}\r\n\r\nfunction getProductDetails() {\r\n if (productDetailsEl) {\r\n return getProductDetailObj(productDetailsEl);\r\n }\r\n\r\n return null;\r\n}\r\n\r\nfunction getProductDetailObj(el) {\r\n var productObj =\r\n {\r\n 'name': el.getAttribute(\"data-name\"),\r\n 'id': el.getAttribute(\"data-google-product-id\")\r\n ?? el.getAttribute(\"data-product-id\")\r\n ?? el.getAttribute(\"data-id\"),\r\n 'internalId': el.getAttribute(\"data-product-id\") ?? el.getAttribute(\"data-id\"),\r\n 'price': el.getAttribute(\"data-price\"),\r\n 'brand': el.getAttribute(\"data-brand\"),\r\n 'category': el.getAttribute(\"data-category\")\r\n };\r\n\r\n return productObj;\r\n}\r\n\r\nfunction getProductObj(el) {\r\n var productObj =\r\n {\r\n 'name': el.getAttribute(\"data-name\"),\r\n 'id': el.getAttribute(\"data-google-product-id\") \r\n ?? el.getAttribute(\"data-product-id\")\r\n ?? el.getAttribute(\"data-id\"),\r\n 'internalId': el.getAttribute(\"data-product-id\") ?? el.getAttribute(\"data-id\"),\r\n 'price': el.getAttribute(\"data-price\"),\r\n 'brand': el.getAttribute(\"data-brand\"),\r\n 'category': el.getAttribute(\"data-category\"),\r\n 'position': el.getAttribute(\"data-position\"),\r\n 'list': el.getAttribute(\"data-list\")\r\n };\r\n\r\n return productObj;\r\n}\r\n\r\nfunction pushEcommerce() {\r\n var products = getProducts();\r\n var promotions = getPromotions();\r\n var productDetails = getProductDetails();\r\n\r\n var ecommerceObj = {\r\n ecommerce: {\r\n currencyCode: 'GBP'\r\n },\r\n }\r\n\r\n if (products.length > 0) {\r\n ecommerceObj.ecommerce.eec = {\r\n impressionView: { products }\r\n };\r\n }\r\n\r\n if (promotions.length > 0) {\r\n ecommerceObj.ecommerce.eec.promoView = {\r\n promoView: { promotions: promotions }\r\n };\r\n }\r\n\r\n if (productDetails != null) {\r\n ecommerceObj.ecommerce.eec = {\r\n detail: { products: [productDetails] }\r\n };\r\n }\r\n\r\n dataLayer.push({ ecommerce: null });\r\n dataLayer.push(ecommerceObj);\r\n}\r\n\r\nfunction getProducts() {\r\n var products = [];\r\n\r\n for (var i = 0; i < elements.length; i++) {\r\n elements[i].addEventListener('click', onProductClick);\r\n\r\n products.push(getProductObj(elements[i]));\r\n }\r\n\r\n return products;\r\n}\r\n\r\nfunction onProductClick(e) {\r\n e.preventDefault();\r\n\r\n var el = e.currentTarget;\r\n var productObj = getProductObj(el);\r\n var productUrl = el.getAttribute(\"href\");\r\n\r\n pushProductClick(productObj, productUrl);\r\n}\r\n\r\nfunction getPromotions() {\r\n var banners = document.querySelector('a.hero-banner');\r\n var promotionsObj = [];\r\n\r\n if (banners) {\r\n for (var i = 0; i < banners.length; i++) {\r\n banners[i].addEventListener('click', onBannerClick);\r\n\r\n promotionsObj.push(getPromotionObj(banners[i]));\r\n }\r\n }\r\n\r\n return promotionsObj;\r\n}\r\n\r\nfunction onBannerClick(e) {\r\n e.preventDefault();\r\n\r\n var el = e.currentTarget;\r\n var promotionObj = getPromotionObj(el);\r\n\r\n onPromoClick(promotionObj);\r\n}\r\n\r\nfunction getPromotionObj(el) {\r\n var promotionObj =\r\n {\r\n 'id': el.getAttribute(\"data-id\"),\r\n 'name': el.getAttribute(\"data-name\"),\r\n 'creative': el.getAttribute(\"data-creative\"),\r\n 'position': el.getAttribute(\"data-position\"),\r\n 'destinationUrl': el.getAttribute(\"href\")\r\n }\r\n\r\n return promotionObj;\r\n}\r\n\r\nfunction onPromoClick(promoObj) {\r\n dataLayer.push({ ecommerce: null }); // Clear the previous ecommerce object.\r\n dataLayer.push({\r\n 'event': 'eec.promoClick',\r\n 'ecommerce': {\r\n 'promoClick': {\r\n 'promotions': [promoObj]\r\n }\r\n }\r\n });\r\n\r\n document.location = promoObj.destinationUrl;\r\n\r\n}\r\n\r\nfunction pushProductClick(productObj, productUrl) {\r\n dataLayer.push({ ecommerce: null });\r\n dataLayer.push({\r\n 'event': 'eec.productClick',\r\n 'ecommerce': {\r\n 'click': {\r\n 'products': [productObj]\r\n }\r\n }\r\n });\r\n\r\n if (productUrl)\r\n document.location = productUrl;\r\n}\r\n\r\nfunction pushAddToCart(productId, quantity = 1) {\r\n var product = getProductsToAddRemove(productId);\r\n product.quantity = quantity;\r\n\r\n dataLayer.push({ ecommerce: null });\r\n dataLayer.push({\r\n 'event': 'eec.addToCart',\r\n 'ecommerce': {\r\n 'add': {\r\n 'products': [product]\r\n }\r\n }\r\n });\r\n}\r\n\r\nfunction getProductsToAddRemove(productId) {\r\n var productContainer = document.querySelector(`[data-id=\"${productId}\"]`);\r\n\r\n if (!productContainer)\r\n productContainer = document.querySelector(`[data-product-id='${productId}']`);\r\n\r\n if (!productContainer)\r\n return;\r\n\r\n return getProductDetailObj(productContainer);\r\n}\r\n\r\nfunction pushRemoveFromCart(productId, quantity = 1) {\r\n var product = getProductsToAddRemove(productId);\r\n product.quantity = quantity;\r\n\r\n dataLayer.push({ ecommerce: null });\r\n dataLayer.push({\r\n 'event': 'eec.removeFromCart',\r\n 'ecommerce': {\r\n 'remove': {\r\n 'products': [product]\r\n }\r\n }\r\n });\r\n\r\n}\r\n\r\nfunction getCheckoutProducts() {\r\n var products = [];\r\n var el = document.getElementsByClassName(\"basket-item\");\r\n\r\n for (var i = 0; i < el.length; i++) {\r\n products.push(getProductDetailObj(el[i]));\r\n }\r\n\r\n return products;\r\n}\r\n\r\nfunction getBasketItems(step, option, basketItemsURL) {\r\n fetch(basketItemsURL, {\r\n method: \"POST\"\r\n }).then(response => response.json())\r\n .then(function (result) {\r\n var products = result.basketVm.Items;\r\n var basketContainer = document.getElementById(\"basketItemsContainer\");\r\n var ulElemen = document.createElement(\"ul\")\r\n var liElem = \"\";\r\n\r\n if (products) {\r\n products.forEach(function (item) {\r\n liElem +=\r\n `
  • \r\n
  • `\r\n });\r\n }\r\n\r\n ulElemen.innerHTML = liElem;\r\n basketContainer.append(ulElemen);\r\n pushCheckout(step, option);\r\n });\r\n}\r\n\r\nfunction onCheckout(step, option, basketItemsURL) {\r\n if (basketItemsURL) {\r\n getBasketItems(step, option, basketItemsURL);\r\n }\r\n else {\r\n pushCheckout(step, option);\r\n }\r\n}\r\n\r\nfunction pushCheckout(step, option) {\r\n var products = getCheckoutProducts();\r\n dataLayer.push({ ecommerce: null });\r\n\r\n var ecommerceObj = {\r\n event: 'eec.checkout',\r\n ecommerce: {\r\n checkout: {\r\n actionField: { step: step },\r\n }\r\n }\r\n }\r\n\r\n if (products && products.length > 0)\r\n ecommerceObj.ecommerce.checkout.products = products;\r\n\r\n if (option)\r\n ecommerceObj.ecommerce.checkout.actionField.option = option.toLowerCase();\r\n\r\n dataLayer.push(ecommerceObj);\r\n}\r\n\r\nfunction onCheckoutOption(step, checkoutOption) {\r\n dataLayer.push({ ecommerce: null });\r\n dataLayer.push({\r\n 'event': 'checkoutOption',\r\n 'ecommerce': {\r\n 'checkout_option': {\r\n 'actionField': { 'step': step, 'option': checkoutOption }\r\n }\r\n }\r\n });\r\n}\r\n\r\n\r\nfunction pushProductView() {\r\n dataLayer.push({ ecommerce: null });\r\n dataLayer.push({\r\n 'event': 'eec.detail',\r\n 'ecommerce': {\r\n 'detail': {\r\n 'products': [getProductDetailObj(productDetailsEl)]\r\n }\r\n }\r\n });\r\n}\r\n\r\nwindow.onload = function () {\r\n pushEcommerce();\r\n}\r\n\r\nexport { pushEnhancedEcommerce, pushAddToCart, pushRemoveFromCart, onCheckout, onCheckoutOption, pushProductView };"],"names":["getCookie","cookieName","cookie","document","split","forEach","el","key","value","trim","setCookie","name","days","expires","date","Date","setTime","getTime","toUTCString","setSessionCookie","getHashKeyValuePairs","this","getUrlKeyValuePairs","window","location","hash","getHrefKeyValuePairs","search","url","result","pairs","substring","i","length","pairParts","push","loadImagesForProductListings_BasedOnView","prodListing","isGridView","hasClass","find","each","index","img","querySelector","setTimeout","newImgUrl","closest","data","attr","src","getImageURL","width","height","imgUrl","ImagesParams","UseCDNImageCache","startsWith","CloudflareAccountHash","atou","b64","decodeURIComponent","escape","atob","utoa","btoa","unescape","encodeURIComponent","deleteCookie","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","__webpack_modules__","d","definition","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","w","doc","ARIAmodal","NS","AUTHOR","VERSION","LICENSE","initialTrigger","activeModal","activeClass","body","main","getElementsByTagName","modal","querySelectorAll","children","useAriaModal","returnToBody","firstClass","lastClass","organizeDOM","refEl","firstElementChild","insertBefore","setupTrigger","self","trigger","getOpenTarget","getAttribute","hasHref","nodeName","setAttribute","tabIndex","removeAttribute","hasAttribute","id","addEventListener","openModal","keyEvents","console","warn","setupModal","modalType","getClass","heading","modalLabel","hideHeading","modalDesc","modalDoc","classList","add","hidden","setupModalCloseBtn","Math","floor","random","makeHeading","focusable","modalClass","doNotGenerate","manualClose","modalClose","modalCloseClass","closeBtn","createElement","type","innerHTML","appendChild","closeModal","e","autoOpen","getTargetModal","focusTarget","getElementById","getAutofocus","preventDefault","contains","requestAnimationFrame","focus","outsideClose","m","remove","firstFocus","lastFocus","keyCode","which","target","click","activeElement","shiftKey","autoLoad","getAuto","hashValue","useHash","checkforDialog","tagName","replace","init","getElementIndex","node","previousElementSibling","initMenu","menu","screen","level2","resetMenu","item","onOffItems","element","action","parentElement","nextElementSibling","documentElement","getElementsByClassName","clickElement","srcElement","toLowerCase","level","activeItemLevel","activeItems","max","menuSubs","menuSub","max1","activeItem","activeItemIndex","menuSubOff","max2","level2MenuSub","level2MenuSubAnchors","b","breadcrumbButtons","maxBreadcrumbs","navLevelElm","navLevel","parseInt","navLevelElmUp1","navLevelElmUp1Button","mobilemenu","expanded","mobilebg","primarynav","style","top","sh","h","stuck","stickPoint","offsetTop","parentElem","offsetParent","getOffsetTop","onscroll","offset","pageYOffset","ToggleButtons","toggle","elem","loginPartial","loginPartialMobile","globalParms","LoginPartialURL","fetch","then","response","text","accountLinks","AccountLinksURL","basketButton","href","itemCount","ShoppingBasketParms","CookieKey","basketDataJSON","JSON","parse","NumberOfItems","err","log","ShoppingBasket_UpdateItemCount","div","n","v","dataset","play","onclick","labnolIframe","evt","parentNode","iframe","dataID","replaceChild","myImgs","observer","IntersectionObserver","entries","entry","isIntersecting","imgElem","loadLazyImages_doImage","unobserve","rootMargin","threshold","image","observe","len","loadLazyImages_notSupported","realSrc","loadLazyImages","initLightYouTube","mainNavContainers","navHeight","elemHeight","getComputedStyle","getPropertyValue","Number","mainContent","minHeight","autoCompleteDebug","test","apply","arguments","selInputBox","autoCompleteIsShowing","baseAutoCompleteSearchRequest","UserId","QueryString","lastAutoCompleteResult","Success","lastDirectResult","checkCanSearch","canSrch","String","doAutoCompleteSearch","now","ms","getUTCSeconds","getUTCMilliseconds","toString","srchText","req","showNewResults","autoCompleteResults","autoCompRes","autoComplete","direct","acr","title","dr","facets","matches","Data","AutoComplete","map","Key","facet","AutoCompleteFacets","AutoCompleteFacetingString","results","concat","slice","linksEl","r","a","append","span","textContent","showAutoCompleteResults","hideAutoComplete","haveResults","show","spinner","list","hide","showAutoComplete","stringify","requestHeaders","Headers","set","autoCompleteUrl","method","headers","json","directMatchUrl","autoCompleteSearch","display","opacity","onClickAutoCompleteResult","useAutoCompleteForSearch","onSearchKeyDown","u","l","allLinks","current","p","onSearchKeyPress","sel","addDelay","ul","anchor","submit","event","input","onkeydown","onkeypress","onchange","initialise","elements","productDetailsEl","getProductObj","onProductClick","productObj","productUrl","currentTarget","dataLayer","ecommerce","onBannerClick","promoObj","getPromotionObj","destinationUrl","onload","products","promotions","productDetails","ecommerceObj","getProducts","banners","promotionsObj","getPromotions","currencyCode","eec","impressionView","promoView","detail"],"sourceRoot":""}